0

非常に単純なシェーダーを現在のOpenGLセットアップで動作させようとしています。シェーダーマネージャーを使用していますが、シェーダーをロードすると、すべての出力に正しくロードされたことが示されます。

これが私のデータです:

static const GLfloat g_vertex_buffer_data[] = {
    -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    0.0f,  1.0f, 0.0f,
};

これが私のバッファを設定する場所です:

// This will identify our vertex buffer
GLuint vertexbuffer;

// Generate 1 buffer, put the resulting identifier in vertexbuffer
glGenBuffers(1, &vertexbuffer);

// The following commands will talk about our 'vertexbuffer' buffer
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);

// Give our vertices to OpenGL.
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

テスト済みで動作するシェーダーローダーを使用したシェーダーの宣言は次のとおりです。

Shader shader;
shader.loadFromFile(VERTEX_SHADER, resourcePath() + "tri.vert");
shader.loadFromFile(FRAGMENT_SHADER, resourcePath() + "tri.frag");
shader.createAndLinkProgram();
shader.use();
shader.addAttribute("position");
shader.unUse();

このシェーダーの属性は、マップに保存されます。これはレンダリング呼び出しです:

shader.use();

    glEnableVertexAttribArray(shader["position"]);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(
                          shader["position"], // attribute 0. No particular reason for 0, but must match the layout in the shader.
                          3,                  // size
                          GL_FLOAT,           // type
                          GL_FALSE,           // normalized?
                          0,                  // stride
                          (void*)0            // array buffer offset
                          );

    // Draw the triangle !
    glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle

    glDisableVertexAttribArray(shader["position"]);

    shader.unUse();

次に、バッファを交換します。古いGL_TRIANGLES固定パイプライン描画を試してみましたが、正常に機能しました。

これが私の頂点シェーダーです:

#version 330
layout(location = 0) in vec3 position;

void main()
{
gl_Position.xyz = position;
} 

これが私のフラグメントシェーダーです:

out vec3 color;

main()
{
color = vec3(1,0,0);
}

単純に赤い三角形を描くことになっています。中間モードを使用して描画すると、正常にレンダリングされます。MacOSX10.7.4でXcodeを実行しています。

4

2 に答える 2

2

gl_Position.xyz=位置;

そして、W座標は何ですか?未定義のままにしないことが重要です。1.0にしたい場合は、次のように設定する必要があります。

gl_Position = vec4(position, 1.0);
于 2012-07-22T06:00:15.193 に答える
0

gl_Positionには、x、y、z、w座標を指定する必要があります。1.50を超えるGLSLバージョンでは、シェーダーで行列操作を提供する必要があります。つまり、GLM http://glm.g-truc.net/などの数学ライブラリを使用して、投影、モデル、行列の表示を行う必要があります。

頂点データセットから、z座標は0.0であり、これはシーンの中心と一致しています。Z座標の-ve値を証明し、結果を確認します。

于 2013-05-31T15:26:24.100 に答える