【问题标题】:Sending transformation to vertex shader fails将转换发送到顶点着色器失败
【发布时间】:2024-01-01 08:19:02
【问题描述】:

我正在使用 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);

现在我的三角形消失了,因为应用了一些非常无效的转换。 “shaderProgram”中的值是正确的,它可以在之前调用片段着色器时正常工作。我也没有收到任何着色器程序的编译错误。

那么知道这里可能出了什么问题吗?

【问题讨论】:

    标签: opengl glsl shader vertex-shader opengl-3


    【解决方案1】:

    统一的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 相关。

    【讨论】: