【问题标题】:OpenGL 3.2 Texturing IssueOpenGL 3.2 纹理问题
【发布时间】:2012-07-24 09:44:24
【问题描述】:

我目前正在使用 C++ 开发 2D 引擎。

我遇到了一个问题,我似乎相信我以前遇到过一次,但后来忘记了我是如何解决它的。

引擎是跨平台的(Win、OSX、Linux),为此我使用 GLFW 作为基础。

当做正常的纹理处理时,我会得到这样的结果:

您可以看到纹理不正确(因为图像应该是我的简单图像)。

使用 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 );

-垂直着色器

#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;
} 

【问题讨论】:

    标签: c++ opengl glsl opengl-3 texturing


    【解决方案1】:
    glVertexAttribPointer( posLocation, 3, GL_FLOAT, GL_FALSE, 0, (void*)0 );
    glVertexAttribPointer( texCoordLocation, 2, GL_FLOAT, GL_FALSE, 0, (void*)0 );
    

    这意味着位置和纹理坐标都来自缓冲区中的相同位置。它们重叠。

    您似乎希望它们来自不同的缓冲区对象。这意味着您必须在第一次和第二次 glVertexAttribPointer 调用之间将一个新缓冲区绑定到 GL_ARRAY_BUFFER

    【讨论】:

    • 感谢您的两个回答!!,虽然我接受了第一个,但两者都是正确的,这对我来说是一个完全愚蠢的疏忽:/ 令人沮丧的是,我花了几个小时试图解决这个问题......我要睡觉了。
    【解决方案2】:
    // 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 应该在绑定 _vboTexCoord 之后设置,而不是 _vboVertices。

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 2013-10-28
      • 2012-03-06
      • 2010-12-27
      相关资源
      最近更新 更多