我正在尝试着色器用于在地形上加载四个纹理细节贴片,方法是根据第五个图像合并它们,其中r,g,b和一个组件用于确定每个纹理应该混合多少.混合工作正常,但是当我尝试添加"mixmap"图像时,它会失败,因为我猜测纹理坐标有问题.
首先,这是着色器:
顶点着色器
void main() {
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
Run Code Online (Sandbox Code Playgroud)
片段着色器
uniform sampler2D Texture0;
uniform sampler2D Texture1;
uniform sampler2D Texture2;
uniform sampler2D Texture3;
uniform sampler2D Mixmap;
varying vec3 pos;
void main()
{
vec4 texel0 = texture2D(Texture0, gl_TexCoord[0].st).rgba;
vec4 texel1 = texture2D(Texture1, gl_TexCoord[0].st).rgba;
vec4 texel2 = texture2D(Texture2, gl_TexCoord[0].st).rgba;
vec4 texel3 = texture2D(Texture3, gl_TexCoord[0].st).rgba;
vec4 mixmapTexel = texture2D(Mixmap, gl_TexCoord[0].st).rgba;
texel0 *= mixmapTexel.r;
texel1 = mix(texel0, texel1, mixmapTexel.g);
texel2 = mix(texel1, texel2, mixmapTexel.b);
gl_FragColor = mix(texel2, texel3, mixmapTexel.a);
}
Run Code Online (Sandbox Code Playgroud)
正如我所说,混合效果很好.问题来自于从我的mixmap读取的值不正确的事实. …
我正在写一个考虑到两个表面的折射着色器.因此,我使用FBO渲染纹理的深度和法线,以及用于表示环境的立方体贴图.我需要使用纹理中存储的法线值来从立方体贴图中获取值,以获得后表面的折射法线.
只要我不尝试从已从纹理中检索其值的矢量访问立方体贴图,立方体贴图就可以完美地工作.
这是一个失败的最小片段着色器.颜色保持绝对黑色.我确信对纹理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;
}
Run Code Online (Sandbox Code Playgroud)
以下是显示为颜色的矢量"方向"的值,只是证明它们不是空的!
这是上面着色器(只是茶壶)的结果.

虽然这段代码完美无缺:
uniform samplerCube cubemap;
uniform vec2 viewportSize;
varying vec3 T1;
void main()
{
vec4 color = textureCube(cubemap, T1);
gl_FragColor = color;
}
Run Code Online (Sandbox Code Playgroud)

每当我访问采样器立方体值时,我都想不出为什么我的颜色会保持黑色的任何原因!
只是为了完整起见,即使我的立方体贴图有效,这里有用于设置它的参数: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, …Run Code Online (Sandbox Code Playgroud)