7

変換フィードバックを使用してデバッグ用に頂点シェーダーからデータを取得しようとしていましたが、パースペクティブ マトリックスが正しく計算されていないように見えました。変換フィードバック バッファに何もありません。どのステップが間違っていたかを理解するのを手伝ってくれる人はいますか?

以下は、変換フィードバックを設定するコードのスニペットです。

//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;
}
4

2 に答える 2

5
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tf_bo);

ドキュメントにglBindBufferBase記載されているように、バッファ オブジェクトにデータ ストレージが必要です (つまり、呼び出しglBufferDataたことが必要です)。の代わりglBindBufferBaseはありません。は、別の用途を持つ別の種類の関数です。glBindBuffer

次に、マトリックスをキャプチャします。問題は、 3 つの頂点を描画していることです。つまり、3 つの頂点をキャプチャすることになります。1 つだけに十分なスペースを割り当てました。これにより、未定義の動作が発生します。

何よりも重要なことは、これで具体的に何を達成できると思いますか? 直接アップロードした均一な値を取得しています。実装のバージョンの glUniformMatrix が何らかの形で壊れていると思わない限り、デバッグにはあまり役に立ちません。

于 2012-11-29T16:13:45.457 に答える