浮點紋理 opengl


原文地址: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),不多說了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM