2012-04-21 18 views
7

Tôi đang cố vẽ một hình lập phương có kết cấu FBO. Các kết cấu được trả lại cho một cách chính xác (mà tôi có thể nhìn thấy trong gDebugger), nhưng nó không hiển thị trên khối lập phương. Tôi nghĩ rằng điều này có thể là một vấn đề với kết cấu FBO vì vậy tôi tải một kết cấu bình thường và thử nó là tốt, nhưng tôi nhận được cùng một vấn đề, chỉ là một khối lập phương màu đen.Kết cấu được tải và bị ràng buộc, nhưng đổ bóng phân đoạn không hiển thị nó

Bước qua chương trình trong gDebugger, tôi có thể thấy rằng kết cấu vừa được tải vừa phải và bị ràng buộc, nhưng không có gì được vẽ. Có vẻ như không có vấn đề gì với texcoords. Lưu ý rằng tôi cũng đã cố gắng xuất ra một màu đồng nhất trong trình đổ bóng phân đoạn hoạt động chính xác.

Đây là vertex shader của tôi:

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

Và đây là shader mảnh của tôi:

#version 420 

uniform sampler2D tex; 

in vec2 f_texcoord; 

out vec4 gl_FragColor; 

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

Và đây là nơi mà tôi rút ra những khối lập phương:

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

Tôi phải mù, bởi vì tôi thấy không có lỗi.

(Ngoài ra, xin lưu ý rằng tôi đang sử dụng SFML và GLEW để tạo bối cảnh và phần mở rộng.)

EDIT:

Tôi không biết nếu điều này sẽ rất hữu ích, nhưng đây là cách tôi thiết lập các khối VBO, đồng phục, v.v .:

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

Bạn có kiểm tra nhật ký lỗi khi biên dịch trình đổ bóng/liên kết chương trình không? Điều duy nhất tôi thấy có thể là vấn đề là các biến bắt đầu với 'gl_' được dành riêng và trình đổ bóng frag có thể trả về lỗi vì biến' gl_FragColor' của bạn. –

+0

oh yeah, và nó không giống như bạn đang ràng buộc bất kỳ thuộc tính đỉnh, vì vậy bạn không thực sự vẽ bất cứ điều gì. –

+0

Bản vẽ là tốt, tôi không bao gồm một phần mà tôi thiết lập của tôi VBO: s, vv Khối lập phương được trả lại như nó cần, nhưng không có texturing. Như tôi đã nói trong câu hỏi, sử dụng gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0) đã tạo thành công một khối màu đỏ. Đối với nhật ký lỗi, nó trống. Tôi có thể thêm thiết lập VBO nếu bạn muốn. – Merigrim

Trả lời

7

=== EDIT ===

Có vẻ như bạn đang thiếu textu thiết lập lại cho bộ lọc rút gọn, đây là vấn đề nếu bạn không sử dụng kết cấu mipmapped. Xem tại đây: http://www.opengl.org/wiki/Common_Mistakes#Creating_a_complete_texture

+1

Có, tôi làm điều đó trong mã khởi tạo của mình. Tôi cũng đã thử thêm nó vào ngay trước khi tôi vẽ khối lập phương nhưng tôi cũng nhận được kết quả tương tự. – Merigrim

+0

@Merigrim bạn có thể đặt tất cả mã khởi tạo không? Không có gì trong những gì bạn hiện đang lên đó sẽ gây ra một vấn đề, theo sự hiểu biết tốt nhất của tôi. – Tim

+0

Được rồi, chỉ một phút. – Merigrim

Các vấn đề liên quan