没有ftransform()的桌面GLSL

时间:2011-11-21 04:49:47

标签: opengl-es glsl

我正在将我的代码库从固定功能OpenGL 1.x移植到OpenGL 2.x - 技术上是OpenGL ES 2.0,但我仍然在桌面上编码,只记得ES 2.0强加的限制这与3.1'新'配置文件类似。

问题是,对于2D以外的任何其他内容,创建一个着色器传递到modelviewprojection矩阵中,因为制服不起作用。通常我会得到一个黑屏,但如果我将所有顶点的Z值设置为0,我就会显示出来。

当我启用ES 2.0模式时,将我的着色器放在RenderMonkey中,但在标准桌面GL上,它只是一个黑屏(没有编译器错误/警告):

vert shader:

uniform mat4 mvp_matrix;
uniform mat4 obj_matrix;
uniform vec4 u_color;
attribute vec3 a_vertex;
attribute vec2 a_texcoord0;

varying vec4 v_color;
varying vec2 v_texcoord0;

void main(void)
{
   v_color = u_color;
   gl_Position = mvp_matrix * (obj_matrix * vec4(a_vertex, 1.0));
   v_texcoord0 = a_texcoord0;
}

frag shader:

uniform sampler2D t_texture0;
varying vec2 v_texcoord0;
varying vec4 v_color;

void main(void)
{
   vec4 color = texture2D(t_texture0, v_texcoord0);
   gl_FragColor = color * v_color;
}

我传递的矩阵为glUniformMatrix4fv(location,1,GL_FALSE,mvpMatrix); 对于2D中绘制的任何内容,此着色器的工作方式类我在这做错了什么?或者我必需在桌面GL上使用ftransform()吗?

1 个答案:

答案 0 :(得分:6)

我认为有一点需要澄清一点:

  • 模型矩阵将对象从对象坐标转换为世界坐标。
  • 视图矩阵将世界坐标转换为眼睛坐标。
  • 投影矩阵将眼睛坐标转换为剪辑坐标。

基于标准命名约定,mvpMatrix按此顺序为projection * view * model。没有其他矩阵需要乘以。投影是您的投影矩阵(正交或透视),视图是相机变换矩阵(不是模型视图),模型是对象的位置,比例和旋转。

我认为问题或者在于将不需要乘法的矩阵相乘或者以错误的顺序乘以矩阵。 (矩阵乘法不是可交换的)

如果您还没有解决这个问题,我建议单独发送所有3个矩阵,然后再将这些值转储回去,以确保发送矩阵没有问题。

顶点着色器:

attribute vec4 a_vertex;
attribute vec2 a_texcoord0;

varying vec2 v_texcoord0;

uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;

void main(void)
{
   gl_Position = projection * view * model * a_vertex;
   v_texcoord0 = a_texcoord0;
}

Fragment Shader:

uniform sampler2D t_texture0;
uniform vec4 u_color;

varying vec2 v_texcoord0;

void main(void)
{
   vec4 color = texture2D(t_texture0, v_texcoord0);
   gl_FragColor = color * u_color;
}

此外,我将颜色均匀地移动到frag着色器,传递它,因为当所有顶点具有相同的颜色时,不需要变化。