将转换发送到顶点着色器失败

时间:2018-10-12 07:29:53

标签: opengl glsl opengl-3 vertex-shader

我正在使用OpenGL进行第一步,目前无法将某些转换发送到我的顶点着色器。当我使用以下着色器程序时,一切正常,并且可以看到我的对象(一个简单的三角形):

layout (location = 0) in vec3 aPos;
void main()
{
   gl_Position = vec4(aPos, 1.0);
}

下一步,我更改了着色器程序以接受来自外部的转换:

layout (location = 0) in vec3 aPos;
uniform mat4 inputTransform;
void main()
{
   gl_Position = inputTransform * vec4(aPos, 1.0);
}

...以及将变换数据发送到着色器的主循环:

unsigned int transformLoc = glGetUniformLocation(shaderProgram,"inputTransform");
glUseProgram(shaderProgram);
GLfloat trans[4] = {1.0, 0.0, 0.0, 1.0};
glUniformMatrix4fv(transformLoc, 1, GL_FALSE,trans);

现在我的三角形disapperas被应用为某些非常无效的变换。 “ shaderProgram”中的值是正确的,它可以与先前对片段着色器的调用一起正常使用。着色器程序也没有得到任何编译错误。

因此,您知道这里可能出什么问题吗?

1 个答案:

答案 0 :(得分:2)

统一mat4 inputTransform是4 * 4矩阵,而不是具有4个分量的向量。
参见Data Type (GLSL) - Matrices

您必须使用16个浮点数数组对其进行初始化,例如通过Identity matrix

GLfloat trans[16] = {
    1.0, 0.0, 0.0, 0.0,
    0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 1.0, 0.0,
    0.0, 0.0, 0.0, 1.0
};
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, trans);

矩阵包含平移,方向(和比例)。在GLSL中,可以初始化mat4

mat4 m44 = mat4(
    vec4( Xx, Xy, Xz, 0.0),
    vec4( Yx, Xy, Yz, 0.0),
    vec4( Zx  Zy  Zz, 0.0),
    vec4( Tx, Ty, Tz, 1.0) ); 

这意味着,如果要使用转换向量初始化矩阵,则可以手动初始化矩阵的转换分量:

Glfloat Tx = 1.0;
Glfloat Ty = 0.0;
Glfloat Tz = 0.0;

GLfloat trans[16] = {
    1.0, 0.0, 0.0, 0.0,
    0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 1.0, 0.0,
    Tx,  Ty,  Tz,  1.0
};

在C ++中,我建议使用GLM library进行与OpenGL和GLSL相关的矩阵和矢量运算。