1

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

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 没有做任何事情。

任何人都可以帮忙吗?

4

1 回答 1

4

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

解决您的问题:制作矩阵的 w 行0 0 0 1,即在您的代码中

"    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"
于 2013-08-14T22:24:44.950 回答