2012-04-25 96 views
0

我對GLSL中的texture2D()和OpenGL中的glTexImage2D()相關的內部格式感到困惑,當我使用時(注意thirdeighth參數):與GLSL中的texture2D()和OpenGL中的glTexImage2D()相關的內部格式

glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA16F_ARB, WINDOW_SIZE, WINDOW_SIZE, 0, GL_RGBA, 
      GL_FLOAT, floatDataPtr); 

我sampler2D的nonclampedvalue在GLSL而不鉗位到[0,1]:

vec4 nonclampedvalue = texture2D(my16floattex2d, texcoord1); 

當我使用:

glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA8, WINDOW_SIZE, WINDOW_SIZE, 0, GL_RGBA, 
      GL_UNSIGNED_BYTE, byteDataPtr); 

我sampler2D在GLSL的clampedvalue鉗位到[0,1]:

vec4 clampedvalue = texuture2D(myunsignedbytetex2d, texcoord2); 

所以我的問題是這樣的:

  1. 我會在GLSL什麼價值時調用在glTexImage2D這樣的(夾緊或不夾緊):

    glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA8, WINDOW_SIZE, WINDOW_SIZE, 0, GL_RGBA, 
         GL_FLOAT, floatDataPtr); 
    
  2. 什麼樣的價值WIL L I得到GLSL時調用glTexImage2D這樣的(夾緊或不夾緊):

    glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA16F_ARB, WINDOW_SIZE, WINDOW_SIZE, 0, GL_RGBA, 
         GL_UNSIGNED_BYTE, byteDataPtr); 
    
  3. 正如我無法找到在OpenGL官方網站的詳細信息,什麼樣的價值將在sampler2D質地回報不同的內部格式以及調用glTexImage2D()時傳遞給紋理的數據的不同類型(如上面提到的GL_FLOAT或GL_UNSIGNED_BYTE)?什麼是所有規則?

有沒有人可以幫忙?

回答

3

我會在GLSL獲得什麼樣的價值時,調用glTexImage2D這樣的(夾緊或不夾緊):

這隻能由"internal format" parameter管轄。規範化的內部格式是...正常化。它們不存儲浮點值;他們存儲整數值是解釋爲作爲浮游物。最大整數值爲1.0,最小值爲0.0(如果是SNORM格式則爲-1.0)。

正如我無法找到在OpenGL官方網站的詳細信息

更努力在下一次;它就在Wiki上。 "internal format"用於創建texturesrenderbuffers。它甚至解釋了最後三個參數控制pixel transfer operations:將數據上傳到圖像。

+0

似乎在我的程序的功能調用:'glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA16F_ARB,WINDOW_SIZE,WINDOW_SIZE,0,GL_RGBA, GL_UNSIGNED_BYTE,byteDataPtr);'給我一個值鉗位到[0,1]。正如我在[內部格式](http://www.opengl.org/wiki/Image_Format)中所描述的那樣,它是不是[0.0f,255.0f]之間的某個值? – toolchainX 2012-04-26 00:47:01

+0

@ tlh1987:這就是爲什麼我將您鏈接到像素傳輸的頁面。*你在[0,1] *之間給了OpenGL值。你說你的數據是按RGBA順序的,而且每個值都是一個無符號字節。因此,你告訴OpenGL你的數據包含整數值,它們被存儲爲標準化的無符號字節。所有的OpenGL都會讀取您的數據並按照您所描述的解釋它,並將其存儲在可以存儲較大數據的紋理中。 – 2012-04-26 01:10:06

+0

是的,你是對的,謝謝你的幫助! – toolchainX 2012-04-26 02:41:51