2012-04-21 3 views
7

FBO 텍스처로 큐브를 그리려합니다. 텍스처가 올바르게 렌더링되지만 (gDebugger에서 볼 수 있음) 큐브에 렌더링되지 않습니다. FBO 텍스처에 문제가있어 일반 텍스처를로드하고 시도해 보았지만 동일한 문제가 발생했습니다. 단지 검은 색 큐브입니다.텍스처가로드되고 바인딩되었지만 조각 셰이더가 렌더링하지 않습니다.

gDebugger에서 프로그램을 단계별로 살펴보면 텍스처가 제대로로드되고 바인딩되어 있지만 아무것도 그려지지 않은 것을 볼 수 있습니다. 또한 texcoords에 문제가없는 것 같습니다. 또한 올바르게 작동하는 프래그먼트 셰이더에서 단색을 출력하려고했습니다.

이 내 버텍스 쉐이더입니다 :

#version 420 

uniform mat4 projection; 
uniform mat4 view; 
uniform mat4 model; 

layout(location = 0) in vec3 vertex; 
layout(location = 1) in vec2 texcoord; 

out vec2 f_texcoord; 

void main() { 
    gl_Position = projection * view * model * vec4(vertex, 1.0); 
    f_texcoord = texcoord; 
} 

그리고 이것은 내 조각 쉐이더입니다 :

#version 420 

uniform sampler2D tex; 

in vec2 f_texcoord; 

out vec4 gl_FragColor; 

void main() { 
    gl_FragColor = texture2D(tex, f_texcoord); 
} 

그리고 큐브 그릴 곳이다 :

ShaderManager::Get("world")->Use(); 
glBindVertexArray(cube_vao); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, tex); 
glDrawArrays(GL_TRIANGLES, 0, 36); 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindVertexArray(0); 

내가이어야합니다 왜냐하면 나는 오류가 없기 때문이다.

(또한, 나는 컨텍스트 생성 및 확장에 SFML 및 GLEW를 사용하고 있음을 유의하시기 바랍니다.)

편집 :

이 도움이 될 것입니다 경우 모르겠어요,하지만이 방법입니다 나는 큐브 VBO, 유니폼, 등 :

glClearColor(1.0, 0.0, 0.0, 1.0); 

glEnable(GL_DEPTH_TEST); 

glGenTextures(1, &tex); 
glBindTexture(GL_TEXTURE_2D, tex); 
sf::Image img; 
img.LoadFromFile("test.png"); 
img.FlipVertically(); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.GetWidth(), img.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, img.GetPixelsPtr()); 
glBindTexture(GL_TEXTURE_2D, 0); 

ShaderTime = 0.0; 
camz = -4.0f; 
rotation_y = 0.0f; 

Shader* shader = ShaderManager::Load("shader", "fx.vert", "fx.frag"); 
Shader* world = ShaderManager::Load("world", "world.vert", "world.frag"); 
shader->Use(); 
glUniform1f(glGetUniformLocation(shader->GetId(), "time"), ShaderTime); 
world->Use(); 
glm::mat4 proj = glm::perspective(60.0f, (float)WINDOW_WIDTH/(float)WINDOW_HEIGHT, 0.1f, 1000.0f); 
glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, camz)); 
glm::mat4 model; 
glUniformMatrix4fv(glGetUniformLocation(world->GetId(), "projection"), 1, GL_FALSE, glm::value_ptr(proj)); 
glUniformMatrix4fv(glGetUniformLocation(world->GetId(), "view"), 1, GL_FALSE, glm::value_ptr(view)); 
glUniformMatrix4fv(glGetUniformLocation(world->GetId(), "model"), 1, GL_FALSE, glm::value_ptr(model)); 
glUniform1i(glGetUniformLocation(world->GetId(), "tex"), 0); 

glGenVertexArrays(1, &cube_vao); 
glBindVertexArray(cube_vao); 
glGenBuffers(1, &cube_vbo); 
glBindBuffer(GL_ARRAY_BUFFER, cube_vbo); 

GLfloat* data = new GLfloat[5 * 36] { 
    // Front 
    -1.0f, -1.0f, 1.0f, 0.0f, 0.0f,  -1.0f, 1.0f, 1.0f, 0.0f, 1.0f,  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 1.0f, 1.0f,  1.0f, -1.0f, 1.0f, 1.0f, 0.0f,  -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 

    // Back 
    -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, -1.0f, 0.0f, 1.0f,  1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 
    1.0f, 1.0f, -1.0f, 1.0f, 1.0f,  1.0f, -1.0f, -1.0f, 1.0f, 0.0f,  -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 

    // Top 
    -1.0f, 1.0f, 1.0f, 0.0f, 1.0f,  -1.0f, 1.0f, -1.0f, 0.0f, 1.0f,  1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 
    1.0f, 1.0f, -1.0f, 1.0f, 1.0f,  1.0f, 1.0f, 1.0f, 1.0f, 1.0f,  -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 

    // Bottom 
    -1.0f, -1.0f, 1.0f, 0.0f, 1.0f,  -1.0f, -1.0f, -1.0f, 0.0f, 1.0f,  1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 
    1.0f, -1.0f, -1.0f, 1.0f, 1.0f,  1.0f, -1.0f, 1.0f, 1.0f, 1.0f,  -1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 

    // Left 
    -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, -1.0f, 0.0f, 1.0f,  -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 
    -1.0f, 1.0f, 1.0f, 0.0f, 1.0f,  -1.0f, -1.0f, 1.0f, 0.0f, 0.0f,  -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 

    // Right 
    1.0f, -1.0f, -1.0f, 0.0f, 0.0f,  1.0f, 1.0f, -1.0f, 0.0f, 1.0f,  1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 0.0f, 1.0f,  1.0f, -1.0f, 1.0f, 0.0f, 0.0f,  1.0f, -1.0f, -1.0f, 0.0f, 0.0f 
}; 

glBufferData(GL_ARRAY_BUFFER, (5 * 36) * sizeof(GLfloat), data, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (GLvoid*)(0)); 
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (GLvoid*)(sizeof(GLfloat) * 3)); 

glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindVertexArray(0); 
+0

쉐이더를 컴파일 할 때 오류 로그를 확인합니까/프로그램을 링크합니까? 내가 볼 수있는 유일한 문제는'gl_'로 시작하는 변수가 예약되어 있고'gl_FragColor' 변수 때문에 frag 쉐이더가 오류를 반환 할 수도 있다는 것입니다. –

+0

오 예, 어떤 꼭지점 속성을 바인딩하는 것처럼 보이지 않으므로 아무 것도 그리지 않습니다. –

+0

드로잉은 괜찮습니다. VBO : s 등을 설정 한 부분은 포함하지 않았습니다. 입방체는 렌더링해야하지만 텍스쳐는 렌더링하지 않습니다. 앞에서 설명한 것처럼 gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0)를 사용하면 빨간색 큐브가 성공적으로 렌더링됩니다. 오류 로그는 비어 있습니다. 원하는 경우 VBO 설정을 추가 할 수 있습니다. – Merigrim

답변

7

=== 편집 ===를 설정하면 textu을 놓치고있는 것 같습니다

축소 필터에 대한 설정입니다. 밉맵 된 텍스처를 사용하지 않는 경우 문제가됩니다. 여기를 참조하십시오 : http://www.opengl.org/wiki/Common_Mistakes#Creating_a_complete_texture

+1

네, 초기화 코드에서 그렇게합니다. 큐브를 그리기 직전에 추가하려고했지만 불행히도 같은 결과가 나타납니다. – Merigrim

+0

@Merigrim 당신은 모든 초기화 코드를 넣을 수 있습니까? 내가 아는 한 최선을 다해 문제를 일으킬 수있는 현재의 상황에는 아무 것도 없습니다. – Tim

+0

좋아, 잠깐. – Merigrim

관련 문제