Problems with texture orientation in space
Posted
by
frankie
on Game Development
See other posts from Game Development
or by frankie
Published on 2014-08-21T12:16:58Z
Indexed on
2014/08/21
22:28 UTC
Read the original article
Hit count: 387
I am currently drawing texture in 3D space and have some problems with it's orientation.
I'd like me textures always to be oriented with front face to user.
My desirable result looks like
Note, that text size stay without changes when we rotating world and stay oriented with front face to user.
Now I can draw text in 3D space, but it is not oriented with front but rotating with world.
Such results I got with following shaders:
Vertex Shader
uniform vec3 Position;
void main()
{
gl_Position = vec4(Position, 1.0);
}
Geometry Shader
layout(points) in;
layout(triangle_strip, max_vertices = 4) out;
out vec2 fsTextureCoordinates;
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
uniform sampler2D og_texture0;
uniform float og_highResolutionSnapScale;
uniform vec2 u_originScale;
void main()
{
vec2 halfSize = vec2(textureSize(og_texture0, 0)) * 0.5 * og_highResolutionSnapScale;
vec4 center = gl_in[0].gl_Position;
center.xy += (u_originScale * halfSize);
vec4 v0 = vec4(center.xy - halfSize, center.z, 1.0);
vec4 v1 = vec4(center.xy + vec2(halfSize.x, -halfSize.y), center.z, 1.0);
vec4 v2 = vec4(center.xy + vec2(-halfSize.x, halfSize.y), center.z, 1.0);
vec4 v3 = vec4(center.xy + halfSize, center.z, 1.0);
gl_Position = projectionMatrix * modelViewMatrix * v0;
fsTextureCoordinates = vec2(0.0, 0.0);
EmitVertex();
gl_Position = projectionMatrix * modelViewMatrix * v1;
fsTextureCoordinates = vec2(1.0, 0.0);
EmitVertex();
gl_Position = projectionMatrix * modelViewMatrix * v2;
fsTextureCoordinates = vec2(0.0, 1.0);
EmitVertex();
gl_Position = projectionMatrix * modelViewMatrix * v3;
fsTextureCoordinates = vec2(1.0, 1.0);
EmitVertex();
}
Fragment Shader
in vec2 fsTextureCoordinates;
out vec4 fragmentColor;
uniform sampler2D og_texture0;
uniform vec3 u_color;
void main()
{
vec4 color = texture(og_texture0, fsTextureCoordinates);
if (color.a == 0.0)
{
discard;
}
fragmentColor = vec4(color.rgb * u_color.rgb, color.a);
}
Any ideas how to get my desirable result?
EDIT 1:
I make edit in my geometry shader and got part of lable drawn on screen at corner. But it is not rotating.
..........
vec4 centerProjected = projectionMatrix * modelViewMatrix * center;
centerProjected /= centerProjected.w;
vec4 v0 = vec4(centerProjected.xy - halfSize, 0.0, 1.0);
vec4 v1 = vec4(centerProjected.xy + vec2(halfSize.x, -halfSize.y), 0.0, 1.0);
vec4 v2 = vec4(centerProjected.xy + vec2(-halfSize.x, halfSize.y), 0.0, 1.0);
vec4 v3 = vec4(centerProjected.xy + halfSize, 0.0, 1.0);
gl_Position = og_viewportOrthographicMatrix * v0;
..........
© Game Development or respective owner