原文地址:http://wangqingyun84.blog.163.com/blog/static/790836172010323113604/
因为 glsl部分 绑定fbo 看到要用浮点纹理,搜了一下看了,此地 留意下
、glGenTextures(GLsizei n,GLuint *textures)返回n个未用的纹理对象标识符,将标识符存在textures这个数组中。返回的标识符大于0即有效。如果标识符过大也是无效。我曾经获得一个特别大的标识符,因为我在构造函数里调用了,此时没有RC(render context),即渲染上下文。
2、glDeleteTextures(GLsizei n,GLuint *textures),和glGenTextures中参数对应,删除textures开始的n个标识符相关联的纹理对象,释放显存。
3、glTexImage3D不是opengl1.1标准里的,要使用,首先要获得函数入口地址: glTexImage3D = (PFNGLTEXIMAGE3DPROC)wglGetProcAddress("glTexImage3D");否则,会出现内存错误,Access Violation at 0xC0000005或者Access Violation at 0xC0000000,很好理解,因为这时候 glTexImage3D 等于NULL。数组大小和glTexImage3D里指定纹理的大小不一致时,也会出现内存错误。
(james: glTexImage3D是个函数指针, 这里直接使用是可以的. 但看到有的文章里是先定义, 再使用:
PFNGLTEXIMAGE3DPROC glTexImage3D;
glTexImage3D = (PFNGLTEXIMAGE3DPROC)wglGetProcAddress("glTexImage3D");
好像这样也可以)
4、我们知道非GL_TEXTURE_RECTANGLE_ARB纹理,纹理坐标都要归一化。其实纹理的数值也被归一化了。比如 glTexImage3D(GL_TEXTURE_3D,
0,
GL_RGBA16,
staticInfo->DataSize[0],
staticInfo->DataSize[1],
staticInfo->DataSize[2],
0,
GL_RGBA,
GL_UNSIGNED_SHORT,
data);
这里data在[0,65535]之间,在显存里对应的是在[0/65535,65535.0/65535]之间。type参数GL_UNSIGNED_SHORT表示的是像素数据在主内存中的存储格式,一个像素在显存里如何储存仅由internal format参数决定。这里internal format如果设置为GL_RGBA16,则表示象素存储为16位整数的RGBA格式。如果要表示浮点纹理,可以使用GL_ARB_texture_float扩展,包括GL_RGB16F_ARB, GL_RGBA16F_ARB, GL_RGB32F_ARB, GL_RGBA32F_ARB等。其中16F表示半精度浮点数。
glTexImage3D(GL_TEXTURE_3D,
0,
GL_RGBA16F_ARB,
staticInfo->DataSize[0],
staticInfo->DataSize[1],
staticInfo->DataSize[2],
0,
GL_RGBA,
GL_FLOAT,
data);
要表示浮点纹理当然还可以通过帧缓冲对象(FBO),不多说了。