2012-11-29 22 views
6

Tôi đã cố gắng sử dụng phản hồi chuyển đổi để truy xuất dữ liệu từ trình đổ bóng đỉnh để gỡ lỗi vì ma trận quan điểm của tôi dường như được tính toán sai. Tôi không có gì trong bộ đệm chuyển đổi phản hồi. Bất cứ ai có thể giúp tôi tìm ra bước mà tôi đã làm sai?cách sử dụng phản hồi chuyển đổi opengl, tôi luôn nhận được 0 trong vùng đệm

Sau đây là đoạn mã của tôi về thiết lập chuyển đổi thông tin phản hồi:

//vertex to be passed into shader 
const float vertexPos[] = 
{ 
    0.75f, 0.75f, 0.0f, 1.0f, 
    0.75f, -0.75f, 0.0f, 1.0f, 
    -0.75f, -0.75f, 0.0f, 1.0f 
}; 

//set up transform feedback 
const char *variableName = "retrieve";//the variable to be retreived in shader 
float dateFromShader[16];//receive the data from shader 
GLuint tf_bo;//transform feedback buffer id 

glTransformFeedbackVaryings(shaderProgram, 1, &variableName, GL_INTERLEAVED_ATTRIBS); 
glLinkProgram(shaderProgram); 

glGenBuffers(1, &tf_bo); 
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, tf_bo);// Is this necessary to call glBindBuffer before glBindBufferBase? 
    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tf_bo); 
    glBufferDate(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(float) * 16, NULL, GL_DYNAMIC_COPY); 
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0); 

//retrieve data from vertex shader 
glEnable(GL_RASTERIZER_DICARD); 
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, tf_bo); 
glBeginTransformFeedback(GL_TRIANGLES); 
    glDrawArrays(GL_TRIANGLES, 0, 3);// 
glEndTransformFeedback(); 

glBindBuffer(GL_ARRAY_BUFFER, tf_bo); 
glGetBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float) * 16, dataFromShader); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
glDisable(GL_RASTERIZER_DISCARD); 

và vertex shader của tôi là như thế này:

#version 420 

layout(location = 0) in vec4 position; 


uniform mat4 perspectiveMatrix; 
out mat4 retrieve; 

void main() 
{ 
gl_Position = perspectiveMatrix * position; 

retrieve = perspectiveMatrix; 
} 
+1

Vì tôi không có bất kỳ trải nghiệm nào với bộ đệm chuyển đổi phản hồi, tôi chỉ có thể khuyên bạn nên thử sao chép một số hướng dẫn trực tuyến như http://ogldev.atspace.co.uk/www/tutorial28/tutorial28.html Thứ hai, bạn có kiểm tra lỗi OpenGl không? Nó có thể là một cái gì đó đang đi sai nhưng bạn không biết về nó. Sử dụng [glGetError] (http://www.opengl.org/sdk/docs/man/xhtml/glGetError.xml) để thực hiện việc này. Nếu nó trả về một lỗi, cố gắng tìm ra cuộc gọi nào đang tạo ra nó bằng cách di chuyển cuộc gọi glGetError. Thứ ba, điều này có vẻ như một cách rất phức tạp để gỡ rối ma trận quan điểm của bạn. Một bett xa – Hannesh

+0

cảm ơn lời khuyên của bạn, tôi sẽ cố gắng kiểm tra ma trận prespective trong mã ứng dụng không đổ bóng. Tôi nghĩ rằng tôi sẽ cần phải sử dụng chuyển đổi thông tin phản hồi sau đó anyway, vì vậy tôi nên tìm hiểu nó thông qua để sử dụng trong tương lai. – Nowibananatzki

Trả lời

5
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tf_bo); 

Như đã nêu in the documentation, glBindBufferBase yêu cầu các đối tượng đệm có lưu trữ dữ liệu (ví dụ: bạn đã gọi là glBufferData trên đó). glBindBufferBase không phải là số thay thế cho glBindBuffer; là một loại chức năng khác có sử dụng khác.

Tiếp theo, bạn đang chụp ma trận. Vấn đề là bạn đang vẽ ba đỉnh, có nghĩa là bạn sẽ chụp ba đỉnh. Bạn chỉ phân bổ đủ không gian cho một. Điều đó sẽ gây ra hành vi không xác định.

Quan trọng nhất là ... bạn nghĩ điều này sẽ đạt được điều gì? Bạn đang nắm bắt giá trị thống nhất bạn đã tải lên trực tiếp. Trừ khi bạn tin rằng phiên bản thực thi của glUniformMatrix bị hỏng theo một cách nào đó, điều đó không hữu ích trong việc gỡ lỗi bất cứ thứ gì.

+0

Cảm ơn sự giúp đỡ của bạn. từ kết quả của ma trận quan điểm nhân với đỉnh mà tôi đã làm bằng tay, tôi nghĩ rằng ma trận quan điểm của tôi là chính xác. Nhưng tại sao tam giác của tôi chỉ hiển thị khi giá trị z được chuyển đổi là âm? vì [n, f] được ánh xạ tới [-1, 1] trong không gian cắt, nên tôi nghĩ điểm 0 Nowibananatzki

+0

@CGPhaha: Đây là một câu hỏi khác không liên quan đến việc hiển thị phản hồi. Bạn nên sử dụng nút "Đặt câu hỏi" để hỏi. –

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