Opengl 向顶点着色器发送变换失败

Opengl 向顶点着色器发送变换失败,opengl,glsl,shader,vertex-shader,opengl-3,Opengl,Glsl,Shader,Vertex Shader,Opengl 3,我正在使用OpenGL执行我的第一步,但目前无法将一些转换发送到我的顶点着色器。当我使用以下着色器程序时,一切正常,我可以看到我的对象(一个简单的三角形): 在下一步中,我更改了着色器程序以接受来自外部的变换: layout (location = 0) in vec3 aPos; uniform mat4 inputTransform; void main() { gl_Position = inputTransform * vec4(aPos, 1.0); } …和我的主循环将变换数

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

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

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”中的值是正确的,它可以在先前调用片段着色器时正常工作。我也没有得到着色器程序的任何编译错误


你知道这里有什么问题吗?

统一的
mat4输入转换
是一个4*4矩阵,而不是一个包含4个分量的向量。

您必须使用16个浮点数的数组对其进行初始化,例如:


矩阵包含平移、方向(和比例)。在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++中,我建议使用与OPENGL和GLSL有关的矩阵运算和向量运算。
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
};