C 顶点着色器矩阵乘法不做任何事情

C 顶点着色器矩阵乘法不做任何事情,c,opengl,opengl-es,vertex-shader,C,Opengl,Opengl Es,Vertex Shader,我一直在努力解决顶点着色器的问题。 我有一个具有以下位置属性的精灵: sprite->vertices[0][0] = -1.0f; sprite->vertices[0][1] = +1.0f; sprite->vertices[1][0] = -1.0f; sprite->vertices[1][1] = -1.0f; sprite->vertices[2][0] = +1.0f; sprite->vertices[2][1] = +1.0f; sprit

我一直在努力解决顶点着色器的问题。 我有一个具有以下位置属性的精灵:

sprite->vertices[0][0] = -1.0f;
sprite->vertices[0][1] = +1.0f;
sprite->vertices[1][0] = -1.0f;
sprite->vertices[1][1] = -1.0f;
sprite->vertices[2][0] = +1.0f;
sprite->vertices[2][1] = +1.0f;
sprite->vertices[3][0] = +1.0f;
sprite->vertices[3][1] = -1.0f;
我这样使用属性:

glUseProgram(sprite->program);

glEnableVertexAttribArray(sprite->position_attrib);
glVertexAttribPointer(sprite->position_attrib, 2, GL_FLOAT, GL_FALSE, 0,
                      sprite->vertices);
这是我的顶点着色器:

static const char character_vshader_g[] =
    "#ifdef GL_ES\n"
    "precision mediump float;\n"
    "#endif\n"
    "uniform   mat4  mvp_u;\n"
    "attribute vec4  position_a;\n"
    "attribute vec2  texture_a;\n"
    "varying   vec2  texture_v;\n"
    "mat4  tmp;\n"
    "void main() {\n"
    "    tmp = mat4(\n"
    "              vec4(0.5, 0  , 0  , 0  ),\n"
    "              vec4(0  , 0.5, 0  , 0  ),\n"
    "              vec4(0  , 0  , 0.5, 0  ),\n"
    "              vec4(0  , 0  , 0  , 0.5) \n"
    "          );\n"
    "    gl_Position = tmp * position_a;\n"
    "    texture_v = texture_a;\n"
    "}\n";
基本上,我正在尝试管理自己的mvp统一矩阵,以便进行调试 我硬编码了这个基本的比例矩阵tmp

我的问题是这个乘法:

gl_Position = tmp * position_a;
除非我将所有0都放在tmp中,否则不会更改任何内容。然后是我的四人组 消失了。否则,我会看到我的四边形占据整个视口(我没有 可以看到的任何类型的投影,因此默认视口为-1,-1到 1,1)

所以tmp几乎什么都没做


有人能帮忙吗?

哦,你的矩阵应用得很好。问题是,
ww
元素是
0.5
,当与
vec2
相乘时,将产生一些
vec4(0.5x,0.5y,0,0.5)
。但是,变换管道中最后一个硬编码步骤是同质透视图分割
v'=v/v.w
。但是a
vec4(0.5x,0.5y,0,0.5)/0.5==vec4(x,y,0,1)
看起来好像什么都没发生过

问题的解决方案:使矩阵的w行
01
,即在代码中

"    tmp = mat4(\n"
"              vec4(0.5, 0  , 0  , 0 ),\n"
"              vec4(0  , 0.5, 0  , 0 ),\n"
"              vec4(0  , 0  , 0.5, 0 ),\n"
"              vec4(0  , 0  , 0  , 1 ) \n"

哦,你的矩阵应用得很好。问题是,
ww
元素是
0.5
,当与
vec2
相乘时,将产生一些
vec4(0.5x,0.5y,0,0.5)
。但是,变换管道中最后一个硬编码步骤是同质透视图分割
v'=v/v.w
。但是a
vec4(0.5x,0.5y,0,0.5)/0.5==vec4(x,y,0,1)
看起来好像什么都没发生过

问题的解决方案:使矩阵的w行
01
,即在代码中

"    tmp = mat4(\n"
"              vec4(0.5, 0  , 0  , 0 ),\n"
"              vec4(0  , 0.5, 0  , 0 ),\n"
"              vec4(0  , 0  , 0.5, 0 ),\n"
"              vec4(0  , 0  , 0  , 1 ) \n"

谢谢你的提醒。直到现在才完全理解同质观点。整洁的谢谢你的提醒。直到现在才完全理解同质观点。整洁的