如果修改顶点位置,简单的OpenGLES 2顶点着色器不起作用

时间:2013-08-29 08:52:49

标签: c# opengl-es opentk

切换到OpenGLES 2.0并遇到顶点着色器问题。如果我没有修正着色器内部的顶点位置并在(-1) - 1范围内指定顶点,一切正常,我看到了我的三角形,但当我尝试修改位置时,我得到了空白屏幕。请看一下代码,请告诉我我是不是白痴。

static float[] squareVertices2 = {
        512f, 0f, 0.0f,
        1024f, 768f, 0.0f,
        0f, 768f, 0.0f
    };

平行投影

projection[0] = 2 / 1024;
projection[1] = (2 / 768);
projection[2] = 1;
projection[3] = -1;

获取句柄

int m_a_positionHandle = GL.GetAttribLocation(CurrentShaderProgram, "a_position");
int m_a_colorHandle = GL.GetAttribLocation(CurrentShaderProgram, "a_color");
int m_u_mvpHandle = GL.GetUniformLocation(CurrentShaderProgram, "uv_Projection");
使用

GL.UseProgram(CurrentShaderProgram);
GL.VertexAttribPointer(m_a_positionHandle, 3, VertexAttribPointerType.Float , false, 0, squareVertices2);
GL.EnableVertexAttribArray(m_a_positionHandle);
GL.VertexAttribPointer(m_a_colorHandle, 4, VertexAttribPointerType.Float, false, 0, squareColors);
GL.EnableVertexAttribArray(m_a_colorHandle);
GL.Uniform4(m_u_mvpHandle, projection[0], projection[1], projection[2], projection[3]);

GL.DrawArrays(BeginMode.Triangles, 0, 3);

着色器来源:

@"uniform vec4 uv_Projection;

attribute vec4 a_position;
attribute vec4 a_color;

varying vec4 v_color;

void main()
{
gl_Position = vec4(a_position.xy * uv_Projection.xy, a_position.z, a_position.w);
v_color = a_color;
}"

我在Windows平台上使用C#和OpenTK。 任何帮助都很感激。感谢。

2 个答案:

答案 0 :(得分:2)

您需要将投影矩阵与位置的全向量相乘,而不仅仅是xy值。

gl_Position = modelViewMatrix * a_Position;

从我的顶点着色器复制

修改

我刚看到你正在使用一个向量乘以位置,我会先坚持一个矩阵,然后当你知道一切正常时切换到向量。保持简单直到你知道一切正常,然后进行优化。

我个人使用完整的矩阵进行UI显示,但我也修改了z和w:

gl_Position = modelViewMatrix * vec4(position.xy, -3, 1);

答案 1 :(得分:0)

我最终发现了什么是错的。实际上,数学存在问题,我的矢量位置值几乎为零。计算平行投影略有不同,并将更改的着色器更改为:

gl_Position = vec4(a_position.xy * uv_proj.xy + uv_proj.zw, 0, 1);

感谢大家的回复