如何使用opengl变换反馈,我总是在缓冲区中得到0

时间:2012-11-29 15:10:58

标签: opengl

我试图使用变换反馈从顶点着色器检索数据以进行调试,因为我的透视矩阵似乎计算错误。我在变换反馈缓冲区中什么都没有。任何人都可以帮我弄清楚我做错了哪一步?

以下是设置转换反馈的代码片段:

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

我的顶点着色器是这样的:

#version 420

layout(location = 0) in vec4 position;


uniform mat4 perspectiveMatrix;
out mat4 retrieve;

void main()
{
gl_Position = perspectiveMatrix * position;

retrieve = perspectiveMatrix;
}

2 个答案:

答案 0 :(得分:5)

glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tf_bo);

如上所述,in the documentation, glBindBufferBase要求缓冲区对象具有数据存储(即:您已在其上调用glBufferData)。 glBindBufferBase不是替代; glBindBuffer;是一种不同的功能,有不同的用途。

接下来,您将捕获一个矩阵。问题是你正在绘制三个顶点,这意味着你要捕获三个顶点。你只为一个人分配了足够的空间。这将导致未定义的行为。

最重要的是......你认为这会完成什么?您正在捕获直接上传的统一值 。除非你认为glUniformMatrix的实现版本在某种程度上被破坏了,否则在调试任何东西时都没有用。

答案 1 :(得分:0)

 glBufferDate(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(float) * 16, NULL, GL_DYNAMIC_COPY);

这行不应该是:

 glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(float) * 16, NULL, GL_DYNAMIC_COPY);

请注意,“ glBufferData”不是“ glBufferDate”。这也将支持以下事实:您没有在缓冲区中获取任何数据/正在返回0 ....