2012-01-11 3 views
4

나는 몇 시간 동안 내 머리를 두드리는 소리를 해왔다. 나는 그것이 단순한 것이라고 확신하지만, 결과를 얻을 수 없다. OpenGL 호출을 캡슐화하기위한 라이브러리를 구축했기 때문에이 코드를 약간 편집해야했지만 다음은 상태에 대한 정확한 설명입니다.OpenGL, Shader Model 3.3 텍스처링 : 검은 텍스처?

#version 330 
in vec4 position; 
in vec2 uv; 
out vec2 varying_uv; 
void main(void) 
{ 
    gl_Position = position; 
    varying_uv = uv; 
} 

그리고 다음 조각 쉐이더 :

#version 330 
in vec2 varying_uv; 
uniform sampler2D base_texture; 
out vec4 fragment_colour; 
void main(void) 
{ 
    fragment_colour = texture2D(base_texture, varying_uv); 
} 

은 모두 쉐이더 컴파일하고 문제없이 프로그램 링크

나는 다음과 같은 버텍스 쉐이더를 사용하고 있습니다. 내 초기화 섹션에서

, 나는 하나의 질감과 같이로드 :

// Check for errors. 
kt::kits::open_gl::Core<QString>::throw_on_error(); 

// Load an image. 
QImage image("G:/test_image.png"); 
image = image.convertToFormat(QImage::Format_RGB888); 

if(!image.isNull()) 
{ 
    // Load up a single texture. 
    glGenTextures(1, &Texture); 
    glBindTexture(GL_TEXTURE_2D, Texture); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.width(), image.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.constBits()); 
    glBindTexture(GL_TEXTURE_2D, 0); 
} 

// Check for errors. 
kt::kits::open_gl::Core<QString>::throw_on_error(); 

당신은 내가 텍스처를로드 할 Qt를 사용하고 있음을 관찰 할 수 있습니다. :: throw_on_error()를 호출하면 OpenGL에서 Error()를 호출하여 오류를 확인하고 발생하면 예외를 throw합니다. 이 코드에서 OpenGL 오류가 발생하지 않으며 Qt를 사용하여로드 된 이미지가 유효합니다.

// Clear previous. 
glClear(GL_COLOR_BUFFER_BIT | 
    GL_DEPTH_BUFFER_BIT | 
    GL_STENCIL_BUFFER_BIT); 

// Use our program. 
glUseProgram(GLProgram); 

// Bind the vertex array. 
glBindVertexArray(GLVertexArray); 

/* ------------------ Setting active texture here ------------------- */ 

// Tell the shader which textures are which. 
kt::kits::open_gl::gl_int tAddr = glGetUniformLocation(GLProgram, "base_texture"); 
glUniform1i(tAddr, 0); 

// Activate the texture Texture(0) as texture 0. 
glActiveTexture(GL_TEXTURE0 + 0); 
glBindTexture(GL_TEXTURE_2D, Texture); 

/* ------------------------------------------------------------------ */ 

// Draw vertex array as triangles. 
glDrawArrays(GL_TRIANGLES, 0, 4); 
glBindVertexArray(0); 
glUseProgram(0); 

// Detect errors. 
kt::kits::open_gl::Core<QString>::throw_on_error(); 

마찬가지로 더 OpenGL은 오류가 발생하지 않으며, 삼각형은 screeen가 그려된다

도면은 다음과 같이 수행된다. 그러나, 그것은 다음과 같습니다 : 그것은 나에게 발생

Texturing, not as expected.

문제가 내 텍스처 좌표 관련이있을 수 있습니다.

Coloring using st coordinates.

텍스처 좌표가 정확 표시, 그러나 나는 아직도의 검은 색 삼각형을 수신 해요 : 그래서, 나는 '녹색'구성 요소로 다음 '빨간색'구성 요소로의를 사용하여 이미지 및 t 렌더링 운명. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

9

나는 이것이 텍스처 오브젝트의 불완전한 init에 달려 있다고 생각한다.

내가 텍스처의 크기를 확인하는 것이 좋습니다 것입니다, 또한 질감 MIN과 MAG 필터

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

을 초기화하기 위해서보십시오. 이 둘의 힘이 아닌 경우에, 당신은 주위에 매우 일반적인 문제

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

블랙 질감이 문제로 인해 종종 있습니다 CLAMP_TO_EDGE하는 포장 모드를 설정해야합니다.

챠오

당신의 조각 쉐이더에서
+0

나는 이것이 적절하다고 생각하지 않습니다. 값이 설정되지 않으면 기본값이 사용됩니다. –

+0

선생님, 사람 중에 신 이십니다! @VJovic 나는 똑같은 생각 :). –

+0

와우 (Wow)가 나에게도이 문제를 해결했습니다. 'GL_TEXTURE_MIN_FILTER'에는 특별히 적절한 기본값이없는 것 같습니다. – Henk

2

당신은 자기 정의 된 대상 즉 gl_FragColor 또는 gl_FragData[…] 수 아니라면

fragment_colour = texture2D(base_texture, varying_uv); 

에 쓰고있어, 당신은 제대로 지정된 조각 데이터의 위치를 ​​설정 했습니까?

+0

음, gl_FragColor는 사용되지 않으며 gl_FragData도 사용되지 않습니다. Post 1.2 (나는 생각한다) 당신은 버퍼를 사용하고 바인드 할 필요가있다. 내가 다른 모든 것을 잘 그릴 수 있다고 가정 할 때, 나는 문제라고 생각하지 않는다. –

+0

@ LiamM : 사실,하지만 우연히 실수로 그걸 놓친 건지 궁금 해서요. – datenwolf