簡體   English   中英

如何在opengl着色器中使用unsigned short?

[英]How to use unsigned short in an opengl shader?

我試圖在着色器中上傳帶有unsigned short的紋理,但它不起作用。

我嘗試過以下方法:

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, vbt[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 640, 480, 0, GL_RED, GL_UNSIGNED_SHORT, kinect_depth);
glUniform1i(ptexture1, 1);
GLenum ErrorCheckValue = glGetError();

我知道我正確地綁定了紋理,因為我通過使用獲得了一些結果

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, vbt[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 640, 480, 0,
    GL_RG, GL_UNSIGNED_BYTE, kinect_depth);
glUniform1i(ptexture1, 1);
GLenum ErrorCheckValue = glGetError();

特別是,我在紅色通道中獲得了部分值。 我想將紋理上傳為無符號字節或浮點數。 但是我沒有設法正確地獲得glTexImage2D調用。 此外,是否可以使用深度紋理類似的東西? 我想對從kinect獲得的深度信息進行一些操作並顯示它。

您對glTexImage2D參數不一致。 第三個參數( GL_RGB )表示您需要3個組件紋理,第7個( GL_RED )表示單組件紋理。 然后你的另一個嘗試使用GL_RG ,它建議2個組件。

您需要使用存儲無符號短路的內部紋理格式,如GL_RGB16UI

如果您想要一個組件,您的呼叫將如下所示:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, 640, 480, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, kinect_depth);

如果你想要三個組件:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16UI, 640, 480, 0, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, kinect_depth);

您還需要確保着色器中用於采樣紋理的類型與紋理中存儲的數據類型相匹配。 在此示例中,由於您使用包含無符號整數值的2D紋理,因此您的采樣器類型應為usampler2D ,並且您希望將采樣操作的結果texture()着色器中的texture()調用結果)存儲在uvec4類型的變量中。 (根據Andon的建議添加的段落)

關於glTexImage2D的格式/類型參數的更多背景,因為這是相當頻繁的誤解的來源:

第三個參數( internalFormat )是OpenGL實現將在紋理中存儲的數據的格式(或者如果硬件不支持確切的格式,則至少是最接近的數據),並且當您從紋理中進行采樣時將使用該數據的格式。

最后3個參數( 格式類型數據 )屬於一起。 格式類型描述數據中的內容 ,即它們描述您傳遞給glTexImage2D調用的數據。

保持兩種格式匹配是一個好主意。 與此情況類似,傳入的數據為GL_UNSIGNED_SHORT ,內部格式GL_R16UI包含無符號短值。 在OpenGL ES中,內部格式需要匹配格式/類型。 完整的OpenGL會在必要時進行轉換,出於性能原因這是不合需要的,並且通常也不是您想要的,因為紋理中數據的精度與原始數據的精度不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM