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;

tmpにすべて0を入れない限り、何も変更しません。その後、私のクワッドが消えます。そうしないと、クワッドがビューポート全体を占めていることがわかります (ご覧のように、投影の種類がないため、デフォルトのビューポートは -1,-1 から 1,1 です)。

つまり、tmp は何もしていないようです。

誰でも助けることができますか?

4

1 に答える 1

4

ああ、あなたのマトリックスは問題なく適用されます。問題は、ww要素が0.5であり、これに a を掛けるとvec2が得られることvec4(0.5x, 0.5y, 0, 0.5)です。ただし、変換パイプラインの最後のハードコーディングされたステップの 1 つは、同種のパースペクティブ分割v' = v/v.wです。しかし、vec4(0.5x, 0.5y, 0, 0.5) / 0.5 == vec4(x, y, 0, 1)何も起こらなかったかのように見える a.

問題の解決策: 行列の 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 に答える