Could you use a TRIANGLE_STRIP? That way you would still manage it with 4 vertices.
Code:0---2 | / | 1/_3
Could you use a TRIANGLE_STRIP? That way you would still manage it with 4 vertices.
Code:0---2 | / | 1/_3
Triangle strips is not the best way as they are continues over more then 2 triangles. Better to draw using index buffer.
In other words draw the verticies as you would normaly do but into a VBO with GL_STREAM_DRAW and then generate a index buffer:
[code=pascal]
0---2 4---6
| / | | / |
1---3 5---7
// Triangle 1
indicies[0]:= 0;
indicies[0]:= 2;
indicies[0]:= 1;
// Triangle 2
indicies[0]:= 2;
indicies[0]:= 3;
indicies[0]:= 1;
// Triangle 3
indicies[0]:= 4;
indicies[0]:= 6;
indicies[0]:= 5;
// Triangle 4
indicies[0]:= 6;
indicies[0]:= 7;
indicies[0]:= 5;
[/code]
and so on...
Amnoxx
Oh, and this code appears to be an approximate replacement for return(random() & 0x01);
Phoenix Wiki
http://www.phoenixlib.net/
Phoenix Forum
http://www.pascalgamedevelopment.com/viewforum.php?f=71
I don't know OpenGL 3 that well but figures described here (http://openbve.trainsimcentral.co.uk/common/faces.png) are basics in all graphics API's? However you can use indexes with triangle_strips too. Only point of indexes is to save memory by reducing vertex calls. But if you compare rendering speed of GL_TRIANGLES and GL_TRIANGLE_STRIP, then strip is always faster.
Now that i think about it, it depends if you render the font characters continuous or 1 by 1. You actually need unique texture coordinate per vertex so continuous is out of question. I guess in this case indexes wouldn't do any good.
I'm still trying to convert a quad into a triangle. I got this code (it's being worked on, hence it looks so ugly):
[code=pascal]
{ .: DrawQuad :. }
procedure DrawQuad(X, Y, Wid, Hgt, Lev, Tu, Tu2, Tv, Tv2: Single);
var
V: array[0..3] of TBrainVector;
begin
Tv := 1 - Tv;
Tv2 := 1 - Tv2;
TexCoords.Add(TexCoord(Tu, Tv));
TexCoords.Add(TexCoord(Tu2, Tv));
TexCoords.Add(TexCoord(Tu2, Tv2));
TexCoords.Add(TexCoord(Tu, Tv2));
V[0] := Vec3(X, Y, -Lev);
V[1] := Vec3(X + Wid, Y, -Lev);
V[2] := Vec3(X + Wid, Y - Hgt, -Lev);
V[3] := Vec3(X, Y - Hgt, -Lev);
Vertices.Add(V[0]);
Vertices.Add(V[1]);
Vertices.Add(V[2]);
Vertices.Add(V[2]);
Vertices.Add(V[3]);
Vertices.Add(V[0]);
end;
[/code]
The quad is drawn correctly, but there's something wrong with its texture coordinates. Can you point me out, what's wrong?
I don't know if it helps, but here is how I draw a quad using a triangle strip:
[pascal]Procedure TParticleSystem.Draw;
Var
i : Integer;
Particle : TParticle;
Begin
glPushAttrib(GL_ALL_ATTRIB_BITS);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glEnable(GL_ALPHA);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
For i := FActiveParticles.Count - 1 Downto 0 Do
Begin
Particle := TParticle(FActiveParticles.Items[i]);
glPushMatrix;
glTranslatef(Particle.X,Particle.Y,Particle.Z);
glScalef(FScale,FScale,1);
glColor4f(Particle.R,Particle.G,Particle.B,Particl e.A);
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2fv(@FImageRect.tRect.t3); glVertex3f(+Particle.Size/2,+Particle.Size/2,0); // Top Right
glTexCoord2fv(@FImageRect.tRect.t2); glVertex3f(-Particle.Size/2,+Particle.Size/2,0); // Top Left
glTexCoord2fv(@FImageRect.tRect.t4); glVertex3f(+Particle.Size/2,-Particle.Size/2,0); // Bottom Right
glTexCoord2fv(@FImageRect.tRect.t1); glVertex3f(-Particle.Size/2,-Particle.Size/2,0); // Bottom Left
glEnd;
glPopMatrix;
End;
glPopAttrib;
End;[/pascal]
cheers,
Paul
Games:
Seafox
Pages:
Syntax Error Software itch.io page
Online Chess
http://gameknot.com/#paul_nicholls
You are adding only 4 texture coordinates (instead of 6) but you use 6 vertices. If you used index buffer you would manage with only 4 texture and vertex coordinates.Originally Posted by Brainer
Ok, I got over the problem with rendering quads.
But now, I'd like to know, how do I put the text in front of the camera in the 2D space? I'm using this code to set the projection matrix:
[code=delphi]
FProjMat := Mat4CreateOrtho(0, FWidth, 0, FHeight, -1.0, 1.0);
[/code]
And this snippet to render the font:
[code=delphi]
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Camera.ProjectionType := ptOrthogonal;
Texture.Bind(0);
Self.DoDefaultRender(Camera);
Texture.UnBind();
Camera.ProjectionType := ptPerspective;
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
[/code]
But the text is not visible in the orthogonal view. It is in the perspective, tho'. What am I doing wrong? Maybe it's something wrong with the shader?
Code:#version 150 precision highp float; uniform mat4 proj; uniform mat4 modelview; in vec4 vertex; in vec3 normal; in vec2 texCoord; out vec3 fragmentNormal; out vec2 textureCoord; void main(void) { fragmentNormal = (modelview * vec4(normal, 0.0)).xyz; textureCoord = texCoord; gl_Position = proj * modelview * vertex; }
Could be a few things:
- You are not using the right Z value
- You are rendering the letters in the wrong position (try (0,0) )
- You are not using the right scale of the letters
- You are rendering the triangles in the wrong order (unlikely though, since it works in perspective view).
WILL asked me to write a little article for PascalGamer that explains how to do both 2D and 3D rendering at the same time. I might do that in the future, if I find the time.
Coders rule nr 1: Face ur bugz.. dont cage them with code, kill'em with ur cursor.
If your triangles are rendered 1-sided (GL_CULL_FACE enabled) then by default ortho is like the backside of perspective. If you turn camera 180 degrees or draw vertices in opposite order it may help. (or coordinates just aren't right...)
I tried both chronozphere and User137 solutions, but none worked.
Hm, I can't understand why it doesn't work. The quads are not displayed. You said the coords may not be right. Here's how I specify them:
[code=delphi]
procedure TBrain2DFont.BuildObject;
const
Txt: String = 'BrainEngine';
Size: Single = 0.025;
Y: Single = 0.0;
var
CurX: single;
Ch: Widechar;
Chaar, I, Ind: integer;
{ .: DrawQuad :. }
procedure DrawQuad(X, Y, Wid, Hgt, Lev, Tu, Tu2, Tv, Tv2: Single);
var
V: array[0..3] of TBrainVector;
begin
TexCoords.Add(TexCoord(Tu, Tv));
TexCoords.Add(TexCoord(Tu2, Tv));
TexCoords.Add(TexCoord(Tu2, Tv2));
TexCoords.Add(TexCoord(Tu2, Tv2));
TexCoords.Add(TexCoord(Tu, Tv2));
TexCoords.Add(TexCoord(Tu, Tv));
V[0] := Vec3(-X, Y, Lev);
V[1] := Vec3(-(X + Wid), Y, Lev);
V[2] := Vec3(-(X + Wid), Y - Hgt, Lev);
V[3] := Vec3(-X, Y - Hgt, Lev);
Vertices.Add(V[0]);
Vertices.Add(V[1]);
Vertices.Add(V[2]);
Vertices.Add(V[2]);
Vertices.Add(V[3]);
Vertices.Add(V[0]);
end;
begin
CurX := 0.0;
if (Length(F) = 0) then
exit;
for I := 1 to length(Txt) do
begin
Ch := Txt[I];
Chaar := integer(ch);
if Chaar = 32 then
begin
Ind := -1;
CurX := CurX + SpaceWidth*Size;
end
else
begin
Ind := CharLookup[Chaar];
end;
if ind > -1 then
begin
CurX := CurX + F[Ind].A*Size;
DrawQuad(CurX, Y, F[ind].Wid*Size, F[ind].Hgt*Size, 0.0, F[ind].x1,
F[ind].x2, F[ind].y1, F[ind].y2);
CurX := CurX + F[Ind].C*Size;
end;
end;
end;
[/code]
This code works, but only in the perspective view. The font is displayed correctly: http://i44.tinypic.com/25sara0.png
So what's wrong?
Bookmarks