2

シンプルな OpenGL プログラムがあり、頂点シェーダーに格納されたインスタンス化された配列を描画しようとしています。レンダリングに次の 2 つのシェーダーを使用しています。

頂点シェーダー:

#version 330 core

uniform mat4 MVP;

const int VertexCount = 4;
const vec2 Position[VertexCount] = vec2[](
vec2(-100.0f, -100.0f),
vec2( -100.0f, 100.0f),
vec2( 100.0f, -100.0f),
vec2(100.0f, 100.0f));

void main()
{   
    gl_Position = MVP * vec4(Position[gl_VertexID], 0.0, 1.0);
}

フラグメント シェーダー:

#version 330 core
#define FRAG_COLOR      0

layout(location = FRAG_COLOR, index = 0) out vec4 Color;

void main()
{
    Color = vec4(0, 1, 0, 1); //let it will be green.
}

これらのシェーダーをコンパイルして検証した後、頂点配列オブジェクトを作成し、三角形のストリップのように描画します。

glUseProgram(programHandle); //handle is checked and valid.
glBindVertexArray(vao);
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, 1);

描画のビューポートは、glViewport(0, 0, 800, 600) のようにウィンドウサイズに設定されます。次のコードを使用して、単純な正射行列を MVP に渡します。

glUniformMatrix4fv(handle, 1, GL_FALSE, (GLfloat*)&matrix); //handle is checked and valid

行列が初期化された場所:

Matrix::CreateOrthographicOffCenter(-200, 200, -200, 200, 1.0f, -1.0f, &matrix);

...
void Matrix::CreateOrthographicOffCenter(float left, float right, float bottom, float top, float zNearPlane, float zFarPlane, Matrix* matrix)
{
memset(matrix, 0, sizeof(Matrix));
    matrix->M11 = 2.0f / (right - left);
    matrix->M14 = (-right - left) / (right - left);
    matrix->M22 = 2.0f / (top - bottom);
    matrix->M24 = (-top - bottom) / (top - bottom);
    matrix->M33 = 1.0f / (zFarPlane - zNearPlane);
    matrix->M34 = (-zNearPlane) / (zFarPlane - zNearPlane);
    matrix->M44 = 1.0f;
}

問題は、画面に三角形のストリップがないことです。MVP マトリックス (gl_Position = vec4(Position[gl_VertexID], 0.0, 1.0)) なしで頂点を描画しようとしましたが、何も得られませんでした。問題がどこにあるかを検出する方法は?

4

1 に答える 1

4
glBindVertexArray(vao);
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, 1);

そして、そのVAOには正確に何が保存されていますか? あなたの答えは「何もない」と思います。

もしそうなら、あなたはいくつかの問題を抱えています。これが互換コンテキスト (または GL 2.1 以前) である場合、OpenGLでは、何も含まれていない VAO でレンダリングすることはできません。つまり、すべての属性を無効にしてレンダリングすることはできません。GL_INVALID_OPERATION エラーが発生します。

ただし、コア コンテキスト 3.2 以降を使用している場合は、VAO を無効にしてレンダリングできます。

もちろん、それは OpenGL の仕様が述べていることです。NVIDIA のドライバーによると、コアと互換性の両方で VAO を無効にしてレンダリングできるということです。ATI のドライバーは、コアと互換性の両方で VAO を無効にするとレンダリングできないと言っています。

つまり、コードを機能させたい場合は、何かをバインドします。配列を有効にして、そこにバッファ オブジェクトを置きます。シェーダーはまったく気にしないので、その中に何が入っているかは問題ではありません。しかし、異なる実装で動作させたい場合は、何かをバインドしてください。

于 2011-08-08T07:00:38.023 に答える