0

現在、C++で2Dエンジンに取り組んでいます。

以前に一度遭遇したと思われる問題に遭遇しましたが、それ以降、どのように修正したかを忘れてしまいました。

エンジンはクロスプラットフォーム(Win、OSX、Linux)であり、これを実現するために、ベースとしてGLFWを使用しています。

通常のテクスチャリングを行うとき、私はこれで終わります:

http://tinypic.com/r/263ec6o/6

ご覧のとおり、テクスチャリングは正しくありません(画像は私の単純な画像であると想定されているため)。

geDebuggerを使用して、GPUにバッファリングされている画像が正しいことを確認できますが、画像に表示されているように、最終的にはどのようになっているのでしょうか。

以下に関連するコードの一部を含めますが、詳細が必要な場合は、お気軽にお問い合わせください。

-バッファ生成コード

glGenVertexArrays( 1, &_vao );
// Generate Buffers and so on.
glBindVertexArray( _vao );

glGenBuffers( 1, &_vboVertices );
glBindBuffer( GL_ARRAY_BUFFER, _vboVertices );
glBufferData( GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * _numVertices, _vertices, GL_STATIC_DRAW );

glGenBuffers( 1, &_vboTexCoords );
glBindBuffer( GL_ARRAY_BUFFER, _vboTexCoords );
glBufferData( GL_ARRAY_BUFFER, sizeof(GLfloat) * 2 * _numVertices, _texCoords, GL_STATIC_DRAW );

glGenBuffers( 1, &_vboIndices );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, _vboIndices );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(GLint) * _numIndices, _indices, GL_STATIC_DRAW );

-レンダリングコード

glm::mat4 modelViewProjMatrix = projMatrix * viewMatrix * modelMatrix;

ShaderResource * shader = ShaderManager::GetInstance()->GetShader( _shaderName.c_str() );
TextureResource * texture = TextureManager::GetInstance()->GetTexture( _textureName.c_str() );

shader->BindShader();

// Bind VAO
glBindVertexArray( _vao );

// Bind all VBO's
glBindBuffer( GL_ARRAY_BUFFER, _vboVertices );
GLint posLocation = shader->GetAttribLocation("in_position");
glVertexAttribPointer( posLocation, 3, GL_FLOAT, GL_FALSE, 0, (void*)0 );
GLint texCoordLocation = shader->GetAttribLocation("in_texCoord");
glVertexAttribPointer( texCoordLocation, 2, GL_FLOAT, GL_FALSE, 0, (void*)0 );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, _vboIndices );

// Enable VBO Pointers
glEnableVertexAttribArray( posLocation );
glEnableVertexAttribArray( texCoordLocation );

// Find and assign Uniforms
GLint MVPMatrixLocation = shader->GetUniformLocation("in_MVPMatrix");
GLint colourLocation = shader->GetUniformLocation("in_colour");
GLint textureLocation = shader->GetUniformLocation("texMap");

glUniformMatrix4fv( MVPMatrixLocation, 1, GL_FALSE, glm::value_ptr( modelViewProjMatrix ) );
glUniform4fv( colourLocation, 1, glm::value_ptr( _colour ) );

// Texture Uniform
if( texture != 0 )
{
    glActiveTexture( GL_TEXTURE0 );
    glUniform1i( textureLocation, 0 );
    glBindTexture( GL_TEXTURE_2D, texture->GetTextureId() );
}

glDrawElements( GL_TRIANGLES, _numIndices, GL_UNSIGNED_INT, (void*) 0 );

glDisableVertexAttribArray( posLocation );
glDisableVertexAttribArray( texCoordLocation );

shader->UnbindShader();

glBindVertexArray( 0 );

-Vertシェーダー

#version 150

in vec3 in_position;
in vec2 in_texCoord;

out vec4 out_colour;
smooth out vec2 out_texCoord;

uniform vec4 in_colour;
uniform mat4 in_MVPMatrix;

void main()
{
out_colour = in_colour;
out_texCoord = in_texCoord;

    gl_Position = in_MVPMatrix * vec4( in_position, 1.0 );
}

-フラグシェーダー

#version 150

in vec4 out_colour;
smooth in vec2 out_texCoord;

out vec4 fragColor;

uniform sampler2D texMap;

void main()
{
    vec4 diffuseTexel = texture2D( texMap, out_texCoord );

    fragColor = out_colour * diffuseTexel;
} 
4

2 に答える 2

3
// Bind all VBO's
glBindBuffer( GL_ARRAY_BUFFER, _vboVertices );
GLint posLocation = shader->GetAttribLocation("in_position");
glVertexAttribPointer( posLocation, 3, GL_FLOAT, GL_FALSE, 0, (void*)0 );
GLint texCoordLocation = shader->GetAttribLocation("in_texCoord");
glVertexAttribPointer( texCoordLocation, 2, GL_FLOAT, GL_FALSE, 0, (void*)0 );

texcoords の VertexAttribPointer は、_vboVertices ではなく、_vboTexCoord をバインドした後に設定する必要があります。

于 2012-07-25T21:05:08.887 に答える
3
glVertexAttribPointer( posLocation, 3, GL_FLOAT, GL_FALSE, 0, (void*)0 );
glVertexAttribPointer( texCoordLocation, 2, GL_FLOAT, GL_FALSE, 0, (void*)0 );

これは、位置とテクスチャ座標の両方がバッファ内の同じ場所から取得されることを意味します。それらが重なること。

それらを異なるバッファオブジェクトから取得したいようです。つまりGL_ARRAY_BUFFER、最初の呼び出しと 2 番目の呼び出しの間に新しいバッファーをバインドする必要がありglVertexAttribPointerます。

于 2012-07-25T21:05:27.630 に答える