gpt4 book ai didi

opengl - 将 FBO 复制到 VBO 时出错

转载 作者:行者123 更新时间:2023-12-04 05:22:25 26 4
gpt4 key购买 nike

在 GPU 上进行一些计算后,我想将存储在 FBO 中的结果复制到 VBO 以进行渲染。

问题:当我进行复制时,某些数据似乎已损坏。我已经检查了缓冲区的格式和大小,还检查了存储在 FBO 中的数据是否正确。

考虑以下初始化 FBO 的代码:

unsigned int verticesTextureId = AllocateTexture(GL_TEXTURE_RECTANGLE, mVBOSize, 1, GL_RGBA32F, GL_RGBA);
CHECK_FOR_OPENGL_ERRORS();

unsigned int normalsTextureId = AllocateTexture(GL_TEXTURE_RECTANGLE, mVBOSize, 1, GL_RGBA32F, GL_RGBA);
CHECK_FOR_OPENGL_ERRORS();

SetUpViewport(mVBOSize, 1);

glBindFramebuffer(GL_FRAMEBUFFER, mFBOId);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE, verticesTextureId, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_RECTANGLE, normalsTextureId, 0);

以下代码初始化 VBO 并将数据从 FBO 复制到 VBO:
mVerticesBufferId = AllocateVBO();
CHECK_FOR_OPENGL_ERRORS();

glBindBuffer(GL_PIXEL_PACK_BUFFER, mVerticesBufferId);
glBufferData(GL_PIXEL_PACK_BUFFER, mVBOSize * 4 * sizeof(float), 0, GL_STATIC_DRAW);

mNormalsBufferId = AllocateVBO();
CHECK_FOR_OPENGL_ERRORS();

glBindBuffer(GL_PIXEL_PACK_BUFFER, mNormalsBufferId);
glBufferData(GL_PIXEL_PACK_BUFFER, mVBOSize * 4 * sizeof(float), 0, GL_STATIC_DRAW);

glReadBuffer(GL_COLOR_ATTACHMENT0);
glBindBuffer(GL_PIXEL_PACK_BUFFER, mVerticesBufferId);
glReadPixels(0, 0, mVBOSize, 1, GL_RGBA, GL_FLOAT, 0);

glReadBuffer(GL_COLOR_ATTACHMENT1);
glBindBuffer(GL_PIXEL_PACK_BUFFER, mNormalsBufferId);
glReadPixels(0, 0, mVBOSize, 1, GL_RGBA, GL_FLOAT, 0);

在这里,我将 VBO 绑定(bind)为顶点/法线属性并调用绘图:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

glBindBuffer(GL_ARRAY_BUFFER, mVerticesBufferId);
glVertexPointer(4, GL_FLOAT, 4 * sizeof(float), 0);

glBindBuffer(GL_ARRAY_BUFFER, mNormalsBufferId);
glNormalPointer(GL_FLOAT, 4 * sizeof(float), 0);

glDrawArrays(GL_POINTS, 0, mVBOSize);

glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

在此调用之后,大多数点都正确显示在屏幕上,但有些点却奇怪地显得格格不入。这似乎与信号或钳位无关,因为具有负数或大于 1 分量的顶点正在正确显示。

我附上了未正确渲染的 kosh 雪花(曲线)的图片。

1)顶点呈现为点:

Kosh Snowflake (with wrong vertices rounded with red circles)

2) 使用简单的几何着色器将顶点渲染为线条:

Kosh Snowflake (wrong vertices circled in red)

引用图片:

Correct Kosh Snowflake

最佳答案

使用 gDEBugger 我发现我的 VBO 上的数据也是正确的。问题是在片段着色器计算之后,我的向量的同质分量(w)上有垃圾,这对变换产生了不必要的影响。

关于opengl - 将 FBO 复制到 VBO 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13568383/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com