Jump to content

  • Log In with Google      Sign In   
  • Create Account

Awesome job so far everyone! Please give us your feedback on how our article efforts are going. We still need more finished articles for our May contest theme: Remake the Classics

#ActualJawline

Posted 26 November 2012 - 07:04 PM

I'm drawing text in OpenGL ES 2.0, I have loaded in the textures from truetype fonts and draw them as two triangles. My issue is that when two characters overlap (For example say writing Team the triangles drawn textured with a and m overlap) then for some reason only one letter shows up, so with respect to the example above you would see the a and half of the e cut off up until the a texture ends. I used the same technique with OpenGL 1 in an old project (Without shaders) and didn't have issues (Both characters showed up fine).

The code that draws each character is
[source lang="cpp"] //Get a pointer to the drawBuffers vertices to manipulate float vertices[4 * 3]; // = drawBuffer->getVertices(); //Set the drawBuffers vertices vertices[0] = X + offsetX; vertices[1] = Y + offsetY; vertices[2] = 0; vertices[3] = X + offsetX; vertices[4] = Y + Height + offsetY; vertices[5] = 0; vertices[6] = X + Width + offsetX; vertices[7] = Y + Height + offsetY; vertices[8] = 0; vertices[9] = X + Width + offsetX; vertices[10] = Y + offsetY; vertices[11] = 0; float tex[4 * 2]; tex[0] = 0; tex[1] = 0; tex[2] = 0; tex[3] = 1; tex[4] = 1; tex[5] = 1; tex[6] = 1; tex[7] = 0; unsigned short indices[6] = { 0, 1, 2, 2, 3, 0 }; fontShader->MakeActive(); fontShader->SetMVP(projection.Multiply(view)); fontShader->SetVertices(vertices, 4, 3 * sizeof(float)); fontShader->SetTextureCoords(tex, 4, 2 * sizeof(float)); fontShader->SetBaseTexture(CharList[Char].charTexture); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);[/source]

and the shader for the UI is

[source lang="cpp"][START FRAGMENT]#ifdef GL_ESprecision lowp float;#endifvarying vec2 v_Tc;uniform sampler2D u_BaseTexture;void main() { gl_FragColor = texture2D(u_BaseTexture, v_Tc);}[END FRAGMENT][START VERTEX]uniform mat4 u_MVP;attribute vec3 a_Vertex;varying vec2 v_Tc;attribute vec2 a_TexCoord;void main() { v_Tc = a_TexCoord; vec4 position = vec4(a_Vertex.xyz, 1.0); gl_Position = u_MVP * position;}[END VERTEX][/source]

any insight into this issue would be invaluable.

#2Jawline

Posted 26 November 2012 - 07:03 PM

I'm drawing text in OpenGL ES 2.0, I have loaded in the textures from truetype fonts and draw them as two triangles. My issue is that when two characters overlap (For example say writing Team the triangles drawn textured with a and m overlap) then for some reason only one letter shows up, so with respect to the example above you would see the a and half of the e cut off up until the a texture ends. I used the same technique with OpenGL 1 in an old project (Without shaders) and didn't have issues (Both characters showed up fine).

The code that draws each character is
[source lang="cpp"] //Get a pointer to the drawBuffers vertices to manipulate float vertices[4 * 3]; // = drawBuffer->getVertices(); //Set the drawBuffers vertices vertices[0] = X + offsetX; vertices[1] = Y + offsetY; vertices[2] = 0; vertices[3] = X + offsetX; vertices[4] = Y + Height + offsetY; vertices[5] = 0; vertices[6] = X + Width + offsetX; vertices[7] = Y + Height + offsetY; vertices[8] = 0; vertices[9] = X + Width + offsetX; vertices[10] = Y + offsetY; vertices[11] = 0; float tex[4 * 2]; tex[0] = 0; tex[1] = 0; tex[2] = 0; tex[3] = 1; tex[4] = 1; tex[5] = 1; tex[6] = 1; tex[7] = 0; unsigned short indices[6] = { 0, 1, 2, 2, 3, 0 }; fontShader->MakeActive(); fontShader->SetMVP(projection.Multiply(view)); fontShader->SetVertices(vertices, 4, 3 * sizeof(float)); fontShader->SetTextureCoords(tex, 4, 2 * sizeof(float)); fontShader->SetBaseTexture(CharList[Char].charTexture); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);[/source]

and the shader for the UI is

[source lang="cpp"][START FRAGMENT]#ifdef GL_ESprecision lowp float;#endifvarying vec2 v_Tc;uniform sampler2D u_BaseTexture;void main() { gl_FragColor = texture2D(u_BaseTexture, v_Tc);}[END FRAGMENT][START VERTEX]uniform mat4 u_MVP;attribute vec3 a_Vertex;varying vec2 v_Tc;attribute vec2 a_TexCoord;void main() { v_Tc = a_TexCoord; vec4 position = vec4(a_Vertex.xyz, 1.0); gl_Position = u_MVP * position;}[END VERTEX][/source]

#1Jawline

Posted 26 November 2012 - 07:03 PM

I'm drawing text in OpenGL ES 2.0, I have loaded in the textures from truetype fonts and draw them as two triangles. My issue is that when two characters overlap (For example say writing Team the triangles drawn textured with a and m overlap) then for some reason only one letter shows up, so with respect to the example above you would see the a and half of the e cut off up until the a texture ends. I used the same technique with OpenGL 1 in an old project (Without shaders) and didn't have issues (Both characters showed up fine).

The code that draws each character is
[source lang="cpp"] //Get a pointer to the drawBuffers vertices to manipulate float vertices[4 * 3]; // = drawBuffer->getVertices(); //Set the drawBuffers vertices vertices[0] = X + offsetX; vertices[1] = Y + offsetY; vertices[2] = 0; vertices[3] = X + offsetX; vertices[4] = Y + Height + offsetY; vertices[5] = 0; vertices[6] = X + Width + offsetX; vertices[7] = Y + Height + offsetY; vertices[8] = 0; vertices[9] = X + Width + offsetX; vertices[10] = Y + offsetY; vertices[11] = 0; float tex[4 * 2]; tex[0] = 0; tex[1] = 0; tex[2] = 0; tex[3] = 1; tex[4] = 1; tex[5] = 1; tex[6] = 1; tex[7] = 0; unsigned short indices[6] = { 0, 1, 2, 2, 3, 0 }; fontShader->MakeActive(); fontShader->SetMVP(projection.Multiply(view)); fontShader->SetVertices(vertices, 4, 3 * sizeof(float)); fontShader->SetTextureCoords(tex, 4, 2 * sizeof(float)); fontShader->SetBaseTexture(CharList[Char].charTexture); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);[/source]

and the shader for the UI is

[START FRAGMENT]
#ifdef GL_ES
precision lowp float;
#endif
varying vec2 v_Tc;
uniform sampler2D u_BaseTexture;
void main() {
gl_FragColor = texture2D(u_BaseTexture, v_Tc);
}
[END FRAGMENT]
[START VERTEX]
uniform mat4 u_MVP;
attribute vec3 a_Vertex;
varying vec2 v_Tc;
attribute vec2 a_TexCoord;
void main() {
v_Tc = a_TexCoord;
vec4 position = vec4(a_Vertex.xyz, 1.0);
gl_Position = u_MVP * position;
}
[END VERTEX]

PARTNERS