2013-04-02 54 views
3

我正在寫一個考慮兩個曲面的折射着色器。 因此,我使用FBO來渲染紋理的深度和法線,並使用立方體貼圖來表示環境。 我需要使用存儲在紋理中的法線值來獲取立方體貼圖中的值,以便獲得背面的折射法線。使用textureCube訪問環境貼圖在片段着色器中失敗

只要我不嘗試從已從紋理中檢索到值的矢量訪問它,立方體貼圖就可以正常工作。

這是最小的片段着色器失敗。顏色保持絕對黑色。 我確定對紋理2D的調用返回非零值:如果我嘗試顯示包含在方向中的紋理顏色(表示法線),我會得到一個完美的彩色模型。無論我使用「方向」矢量進行哪種操作,它都會一直處於失敗狀態。

uniform samplerCube cubemap; 
uniform sampler2D normalTexture; 
uniform vec2 viewportSize; 

void main() 
{ 
    vec3 direction = texture2D(normalTexture, gl_FragCoord.xy/viewportSize).xyz; 
    // direction = vec3(1., 0., 0) + direction; // fails as well!! 
    vec4 color = textureCube(cubemap, direction); 
    gl_FragColor = color; 
} 

下面是以顏色顯示的矢量「direction」的值,只是證明它們不是null! Values of "direction" 這裏是上述着色器(只是茶壺)的結果。 enter image description here

儘管此代碼工作完美:

uniform samplerCube cubemap; 
uniform vec2 viewportSize; 
varying vec3 T1; 

void main() 
{ 
    vec4 color = textureCube(cubemap, T1); 
    gl_FragColor = color; 
} 

enter image description here

我想不出任何理由爲什麼每當我訪問採樣多維數據集值我的顏色會留下黑色的!

只是爲了完整起見,即使我的立方體貼圖作品,這裏是用來設置它的參數: glGenTextures(1 & mTextureId);

glEnable(GL_TEXTURE_CUBE_MAP); 
glBindTexture(GL_TEXTURE_CUBE_MAP, mTextureId); 
// Set parameters 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 

除非我錯過了某處重要的東西,我想這可能是一個驅動程序錯誤。 我沒有任何顯卡,我使用的是英特爾酷睿i5處理器芯片組。

00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09) 

任何想法爲什麼這可能會發生,或者你有解決方法嗎?

編輯:下面是如何我的着色器類結合紋理

4 textures to bind 
Bind texture 3 on texture unit unit 0 
Bind to shader uniform: 327680 
Bind texture 4 on texture unit unit 1 
Bind to shader uniform: 262144 
Bind texture 5 on texture unit unit 2 
Bind to shader uniform: 393216 
Bind texture 9 on texture unit unit 3 
Bind to shader uniform: 196608 

紋理3和4是深度,5是法線圖,圖9是立方體貼圖。

而任何結合的代碼:

void Shader::bindTextures() { 
    dinf << m_textures.size() << " textures to bind" << endl; 
    int texture_slot_index = 0; 
    for (auto it = m_textures.begin(); it != m_textures.end(); it++) { 
     dinf << "Bind texture " << it->first<< " on texture unit unit " 
       << texture_slot_index << std::endl; 
     glActiveTexture(GL_TEXTURE0 + texture_slot_index); 
     glBindTexture(GL_TEXTURE_2D, it->first); 
     // Binds to the shader 
     dinf << "Bind to shader uniform: " << it->second << endl; 
     glUniform1i(it->second, texture_slot_index); 
     texture_slot_index++; 
    } 
    // Make sure that the texture unit which is left active is the number 0 
    glActiveTexture(GL_TEXTURE0); 

} 

m_textures是地圖的紋理ID來均勻的id。

回答

0

我想通了,相當愚蠢的事真。 我忘了更改我的着色器函數來將立方體貼圖綁定爲GL_TEXTURE_CUBE_MAP,所有內容都被綁定爲GL_TEXTURE_2D!

無論如何,謝謝!

5

對於法線貼圖和立方貼圖,您似乎沒有使用單獨的紋理單元。一切都默認爲紋理單元0.您需要類似於:

uniform sampler2D norm_tex; 

uniform samplerCube cube_tex; 

在着色器中。使用(3)時紋理查找應該只使用'超載'texture函數。2+)核心配置文件。有了(3.3+),你也可以使用sampler objects

生成和紋理綁定到單獨的紋理單元:

... generate 'norm_tex' and 'cube_tex' ... 

glActiveTexture(GL_TEXTURE0); 
... bind 'norm_tex' and set parameters ... 

glActiveTexture(GL_TEXTURE1); 
... bind 'cube_tex' and set parameters ... 

... glUseProgram(prog); ... 

glUniform1i(glGetUniformLocation(prog, "norm_map"), 0); 
glUniform1i(glGetUniformLocation(prog, "cube_map"), 1); 
+0

感謝您的回答! 我也想到了這個問題,但我敢肯定,紋理綁定正確。我的着色器類綁定了所有的紋理,然後將它們分配給着色器的統一值。 看到我的問題,如果你想看到什麼是綁定的痕跡。 – geenux

+0

@geenux - 片段着色器僅列出一個採樣器。 –

+0

是的,我忘了將它添加到最小化着色器中,但這不是問題;) 現在一切都已修復! – geenux

相關問題