2016-04-12 37 views
1

ビットマップテクスチャを使用して2Dラベルをレンダリングしようとすると、テクスチャのサンプリングが黒く戻ります。 RenderDocを使ってデバッグしようとしましたが、問題が見つかりません。テクスチャがうまくロードされ、正しいレジスタに格納されているように見えますが、それでもまだ黒くレンダリングされています。OpenGLの黒いテクスチャ

テクスチャの座標を確認するために完全な赤いテクスチャを使用してみましたが、まだテクスチャが黒く表示されました。

Pipeline texture Texture output output ここで私はロード/テクスチャをレンダリングするために使用するコードです。それはラベルをレンダリングしようとしました。 (genMipMapsはfalseです)。

void Texture::CreateGLTextureWithData(GLubyte* data, bool genMipMaps) { 
    if (bitmap) 
     glDeleteTextures(1, &bitmap); 

    glGenTextures(1, &bitmap); 
    glBindTexture(GL_TEXTURE_2D, bitmap); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

    if (genMipMaps) 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); 
    else 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 

    if (genMipMaps) 
     glGenerateMipmap(GL_TEXTURE_2D); 
} 

カスタムサンプラー:

glGenSamplers(1, &linearSampler); 
glSamplerParameteri(linearSampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glSamplerParameteri(linearSampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glSamplerParameteri(linearSampler, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 

glSamplerParameteri(linearSampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glSamplerParameteri(linearSampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

glSamplerParameteri(linearSampler, GL_TEXTURE_COMPARE_FUNC, GL_NEVER); 

glSamplerParameterf(linearSampler, GL_TEXTURE_MIN_LOD, 0); 
glSamplerParameterf(linearSampler, GL_TEXTURE_MAX_LOD, GL_TEXTURE_MAX_LOD); 
glBindSampler(0, linearSampler); 

レンダリング:

glDisable(GL_DEPTH_TEST); 
glDisable(GL_STENCIL_TEST); 
glEnable(GL_CULL_FACE); 
glCullFace(GL_BACK); 
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 

glActiveTexture(GL_TEXTURE0 + 0); 
glBindTexture(GL_TEXTURE_2D, texture->getBitmap()); 
// Set index and vertex buffers 
GLuint vao; 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 


if (glIsBuffer(vertBuffer) && vertBuffer != lastVertBuffer) 
    glBindBuffer(GL_ARRAY_BUFFER, vertBuffer); 

if (glIsBuffer(indexBuffer) && indexBuffer != lastIndexBuffer) 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 

shader->updateLayout(); 

// Draw 
const void* firstIndex = reinterpret_cast<const void*>(0); 
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, firstIndex); 

glBindVertexArray(0); 

シェーダー:

VS:

#version 430 core 

// Vertex atributes 
in vec3 a_position; 
in vec2 a_texture; 
in vec4 a_color; 


// Constant buffers 
layout(std140) uniform VertexBlock 
{ 
    mat4 u_wvp; 
    mat4 u_world; 
}; 

// Vertex shader outputs 
out vec2 v_texture; 
out vec4 v_color; 

void main() 
{ 
    v_texture = a_texture; 
    v_color = a_color; 
    gl_Position = u_wvp * vec4(a_position, 1.0); 
} 

FS:(私はテクスチャを使用せずに赤に色を設定しようと、それが正常に赤でレンダリングされます。)

#version 430 core 

in vec4 v_color; 
in vec2 v_texture; 

layout(binding = 0) uniform sampler2D u_texture; 

out vec4 fragColor; 

void main() 
{ 
    fragColor = v_color * texture(u_texture, v_texture); 
} 

答えて

1

は、問題が何であったかが分かりました。私は2Dテクスチャのミップマップを生成していませんでしたが、サンプラーはまだそれらを使用していました。

テクスチャロード:

... 
if (genMipMaps) 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); 
else 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 

if (genMipMaps) 
    glGenerateMipmap(GL_TEXTURE_2D); 
... 

サンプラー:私はちょうど常にテクスチャにミップマップを生成され、それを修正するためにやった

... 
glSamplerParameteri(linearSampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glSamplerParameteri(linearSampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
... 

関連する問題