我正在寫一個考慮兩個曲面的折射着色器。 因此,我使用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! 這裏是上述着色器(只是茶壺)的結果。
儘管此代碼工作完美:
uniform samplerCube cubemap;
uniform vec2 viewportSize;
varying vec3 T1;
void main()
{
vec4 color = textureCube(cubemap, T1);
gl_FragColor = color;
}
我想不出任何理由爲什麼每當我訪問採樣多維數據集值我的顏色會留下黑色的!
只是爲了完整起見,即使我的立方體貼圖作品,這裏是用來設置它的參數: 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。
感謝您的回答! 我也想到了這個問題,但我敢肯定,紋理綁定正確。我的着色器類綁定了所有的紋理,然後將它們分配給着色器的統一值。 看到我的問題,如果你想看到什麼是綁定的痕跡。 – geenux
@geenux - 片段着色器僅列出一個採樣器。 –
是的,我忘了將它添加到最小化着色器中,但這不是問題;) 現在一切都已修復! – geenux