2016-10-13 24 views
4

OpenGL 4.5を使って三角形をレンダリングしたいと思います。私はOpenGLの古いバージョンを使用しているが、OpenGL 4.5の機能を使用していないものの、オンラインのサンプルをたくさん見つけました。したがって、私は自分自身でいくつかのコードを "アップグレード"しようとしました。これは、古い作業コードです:OpenGL 4.5でのvaoとバッファの使い方

// Triangles to render 
vec3 vertices[2][3] = { { vec3(-0.90f, -0.90f, 1.0f), vec3(0.85f, -0.90f, 1.0f), vec3(-0.90f, 0.85f, 1.0f) }, 
        { vec3(0.90f, -0.85f, 1.0f), vec3(0.90f, 0.90f, 1.0f), vec3(-0.85f, 0.90f, 1.0f) } }; 

//Initialize 
glGenVertexArrays(1, &vaos); 
glBindVertexArray(vaos); 

glGenBuffers(1, &buffers); 
glBindBuffer(GL_ARRAY_BUFFER, buffers); 
glBufferData(GL_ARRAY_BUFFER, sizeof(triangles), triangles, GL_STATIC_DRAW); 

ShaderInfo shaders[] = { 
    { GL_VERTEX_SHADER, "triangles.vert" }, 
    { GL_FRAGMENT_SHADER, "triangles.frag" }, 
    { GL_NONE, NULL } 
}; 
program = LoadShaders(shaders); 
glUseProgram(program); 

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 
glEnableVertexAttribArray(0); 

//Render 
GLint index; 
index = glGetUniformLocation(program, "projectionMatrix"); 
glUniformMatrix3fv(index, 1, true, value_ptr(projectionMatrix)); 
glClear(GL_COLOR_BUFFER_BIT); 
glBindVertexArray(vaos); 
glDrawArrays(GL_TRIANGLES, 0, nvertices); 

そして、私は、画面上で何かを描くためには表示されません。このコードは、それを「更新」:

// Same triangles 
// Initialize 
glCreateVertexArrays(1, &vaos); 
glEnableVertexArrayAttrib(vaos, 0); 
glVertexArrayAttribFormat(vaos, 0, 3, GL_FLOAT, GL_FALSE, 0); 

glCreateBuffers(1, &buffers); 
glNamedBufferData(buffers, sizeof(triangles), triangles, GL_STATIC_DRAW); 

glVertexArrayAttribBinding(vaos, 0, 0); 
glVertexArrayVertexBuffer(vaos, 0, buffers, 0, 0); 

ShaderInfo shaders[] = { 
    { GL_VERTEX_SHADER, "triangles.vert" }, 
    { GL_FRAGMENT_SHADER, "triangles.frag" }, 
    { GL_NONE, NULL } 
}; 
program = LoadShaders(shaders); 
glUseProgram(program); 

// Same render 

誰かが私が間違って何をしたかを教えてもらえ?

編集: triangle.frag

#version 450 

in vec4 gl_FragCoord; 
out vec4 fColor; 

void main() 
{ 
    fColor = vec4 (0.0, 0.0, 1.0, 1.0); 
} 

triangle.vert

#version 450 

layout (location = 0) in vec3 vPosition; 

uniform mat3 projectionMatrix; 

void main() 
{ 
    vec3 tmp = projectionMatrix*vPosition; 
    gl_Position = vec4 (tmp, 1.0f); 
} 
+2

が必要になりますドライバがまだ存在しない場合は、以前の実装に限定される可能性があります。何をやっているの?シェイダーは通常の問題です。 –

+0

GTX 760と最新のドライバがインストールされています。私は、OpenGL拡張を読み込むためにglewを使用しており、ARB_direct_state_accessが利用可能であることを確認します。 – para

+0

#version 450の代わりに#version 430を試してください....これはGTX 760がOpenGL 4.3をサポートしていると言っています。http://www.geforce.com/hardware/desktop-gpus/geforce-gtx-760/specifications –

答えて

1

は、犯人が最も可能性が高い。この行されます。

glVertexArrayVertexBuffer(vaos, 0, buffers, 0, 0); 

は、最後のパラメータは、strideです2つの連続するアレイ要素間の距離を意味する。伝統的なglVertexAttribPointerコールでは、strideパラメータもありますが、わずかなセマンティック違いがあります:

あなたはglVertexAttribPointer0strideを使用している場合、これはcount * sizeof(type)を書くための便利なショートカットで、しっかりとパックされたと仮定します属性配列

のストライドでは、0を意味するだけで、0を意味するので、その描画呼び出しのすべての頂点に非常に同じ要素が与えられます。 glVertexArrayVertexBufferは、任意の頂点属性に直接結び付けられていないので、同じシャルルカットを提供することはできません。また、いくつかの属性は同じバッファインデックスを参照できます。 (バインディングを設定する前または後で頂点フォーマットを設定できるので、インターフェイスも非常に奇妙です。したがって、後で評価する必要があります)

概念的には、ストライドはではないの部分です。属性書式フォーマットは、単一の頂点に必要なものすべてを記述します。この変更はダイレクト・ステート・アクセスとは何の関係もないことに注意してください。これは実際にARB_vertex_attrib_binding(コア4.3以降のコア)で導入されました。これは、バッファリングを属性フォーマット記述から分離しました。その文書内の問題(2)と(3)は、この質問に非常に関連しています

(2)どのようにBindVertexBufferで解釈ゼロのストライドのですか?

解決済み:エラーは発生しません。特定の 属性のすべての配列要素は、バッファ内の同じ場所から取得されます。

(3)VertexAttribPointerでは、ゼロのストライドはどのように処理されますか?

解決済み:BindVertexBufferは、アトリビュートフォーマットについての知識がありません。 だから、VertexAttribPointerはストライド自体を計算する必要があります。ただし、 アプリケーションがゼロのストライドを指定し、次に VERTEX_ATTRIB_ARRAY_STRIDEを照会すると、ゼロを返します。したがって、導出されたストライド はBindVertexBufferに渡され、最初はVertexAttribPointerに渡されたストライド とは別にトラッキングする必要があります。したがって、この仕様では別の状態の が導入されています(VERTEX_BINDING_STRIDE)。 レンダリングでは常に VERTEX_BINDING_STRIDEが使用されます。

これは、APIが であると、誤った状態のクエリにつながる可能性があります。たとえば、次のように

VertexAttribPointer(0, 3, FLOAT, FALSE, 12, 0); 
    // VERTEX_ATTRIB_ARRAY_STRIDE = 12 
    // VERTEX_BINDING_STRIDE = 12 
    BindVertexBuffer(0, buffer, 0, 16) 
    // now VERTEX_ATTRIB_ARRAY_STRIDE is still 12, but 
    // VERTEX_BINDING_STRIDE = 16. 

は長い話を短くするには:あなたのユースケースでは、あなたは、あなたがOpenGLのバージョン4.xをサポートするために、非常に近代的なグラフィックスプロセッサを持っている必要があります

glVertexArrayVertexBuffer(vaos, 0, buffers, 0, 3*sizeof(GLfloat)); 
関連する問題