gpt4 book ai didi

opengl - (OpenGL) 如何读回纹理缓冲区?

转载 作者:行者123 更新时间:2023-12-01 21:38:49 25 4
gpt4 key购买 nike

glGetBufferSubData 是否同时用于常规缓冲区和纹理缓冲区?我正在尝试解决为什么我的纹理没有显示,当我使用 glGetBufferSubData 读取缓冲区时,我得到一些垃圾

struct TypeGLtexture //Associate texture data with a GL buffer
{
TypeGLbufferID GLbuffer;
TypeImageFile ImageFile;

void GenerateGLbuffer ()
{
if (GLbuffer.isActive==true || ImageFile.GetPixelArray().size()==0) return;
GLbuffer.isActive=true;
GLbuffer.isTexture=true;
GLbuffer.Name="Texture Buffer";
GLbuffer.ElementCount=ImageFile.GetPixelArray().size();

glEnable(GL_TEXTURE_2D);
glGenTextures (1,&GLbuffer.ID); //instantiate ONE buffer object and return its handle/ID
glBindTexture (GL_TEXTURE_2D,GLbuffer.ID); //connect the object to the GL_TEXTURE_2D docking point
glTexImage2D (GL_TEXTURE_2D,0,GL_RGB,ImageFile.GetProperties().width, ImageFile.GetProperties().height,0,GL_RGB,GL_UNSIGNED_BYTE,&(ImageFile.GetPixelArray()[0]));

if(ImageFile.GetProperties().width==6){
cout<<"Actual Data"<<endl;
for (unsigned i=0;i<GLbuffer.ElementCount;i++) cout<<(int)ImageFile.GetPixelArray()[i]<<" ";
cout<<endl<<endl;

cout<<"Buffer data"<<endl;
GLubyte read[GLbuffer.ElementCount]; //Read back from the buffer (to make sure)
glGetBufferSubData(GL_TEXTURE_2D,0,GLbuffer.ElementCount,read);
for (unsigned i=0;i<GLbuffer.ElementCount;i++) cout<<(int)read[i]<<" ";
cout<<endl<<endl;}
}

enter image description here



编辑:使用 glGetTexImage(GL_TEXTURE_2D,0,GL_RGB,GL_UNSIGNED_BYTE,read);
数据仍然不同: enter image description here

最佳答案

是的,这适用于纹理缓冲区,如果这实际上是其中之一的话。

glGetBufferSubData (...) 适用于 Buffer Objects 。你这里有一个Texture Object ,如果您调用 glGetError (...) 来检查错误状态,您实际上应该会收到 API 错误。这是因为 GL_TEXTURE_2D 不是缓冲区目标,而是一种纹理对象。

很不幸,你混淆了术语。更不幸的是,有一种字面意思是buffer texture的东西。 (它是一种特殊的一维纹理),允许您将缓冲区对象视为非常有限的纹理形式。

您应该考虑“数据存储”,而不是宽松地使用术语“缓冲区”来考虑这些事情。这是 OpenGL 用来避免歧义的术语;纹理对象有数据存储,缓冲区对象也有。除非您创建一个纹理缓冲区对象来链接这两个东西,否则它们是不同的概念。

从纹理对象读回数据比这复杂得多。

在从 OpenGL 中读取像素数据之前,您必须定义像素格式和数据类型。 OpenGL 旨在将数据从纹理的内部格式转换为您请求的任何(兼容)格式。这就是为什么您实际寻找的函数具有以下签名:

void glGetTexImage (GLenum      target,
GLint level,
GLenum format, // GL will convert to this format
GLenum type, // Using this data type per-pixel
GLvoid * img);

这适用于存储像素数据的所有类型的 OpenGL 对象。事实上,您可以使用 Pixel Buffer Object将纹理对象中的像素数据传输到单独的缓冲区对象中。然后,您可以在该像素缓冲区对象上使用 glGetBufferSubData (...),就像您最初尝试做的那样。

关于opengl - (OpenGL) 如何读回纹理缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32149512/

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