2014-04-17 71 views
2

glActiveTexture()拋出GL_INVALID_ENUM

glActiveTexture(GL_TEXTURE0+32); 

拋出GL_INVALID_ENUM(如我發現運行glGetError()),而

glActiveTexture(GL_TEXTURE0+31); 

運行正常。

根據the documentation

「如果質地不GL_TEXTUREi,其中i的範圍從0到GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS減一的值中的一個GL_INVALID_ENUM產生」。

但在我的情況GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS被定義爲35661,並根據相同的文檔

「的紋理單元的數目是依賴於實現的,但必須至少爲80」。

我該如何解決這個問題?

以防萬一,GL_TEXTURE0被定義爲33984和我的OpenGL的版本是2.1

+1

GL規定每級16個紋理圖像單位。 GL 2.1只有兩個階段(頂點和片段)。因此,如果不是80(Vertex,Fragment,Tessellation Control,Tessellation Evaluation,Geometry-GL4),你有32個。 –

回答

4

GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS可以定義爲35661,但是這不是你想要的,那是一個枚舉值(同GL_TEXTURE0被定義爲33984)。這些值完全沒有意義。

您通過查詢glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &texture_units);得到編號,它將返回您可以使用的紋理數量。這很可能是OpenGL 2.1版本中的32。

4

該文檔是有點誤導。它們表示通過檢索值

glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, ...) 

不是令牌本身的值。

+0

謝謝glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,&data)在數據中返回32 ...所以我只能有32個紋理?是不是太少? –

+3

@MatiasMorant:你讓紋理與紋理單元混淆。您得到的數字是可以在同一時間繪製單個批次的幾何體時使用的紋理數量。每個紋理單元可以保持不同的紋理。紋理綁定到紋理單元使用glBindTexture – datenwolf

+1

@MatiasMorant:你的代碼通常在foreach中的對象{for我在count(o.textures){glActiveTexture(GL_TEXTURE0 + i); glBindTexture(GL_TEXTURE_ ...,o.textures [i])} o.draw()}' – datenwolf

相關問題