Opengl es 通过WebGL使用GLSL的投影纹理映射

Opengl es 通过WebGL使用GLSL的投影纹理映射,opengl-es,glsl,webgl,shader,Opengl Es,Glsl,Webgl,Shader,我想将纹理投影到墙上或任何对象上。我根据这个Cg投影纹理贴图(ctrl-f“9.3”)修改了这个着色器,如下所示,但是我得到了一个空白的白色画布。我是着色器新手,不太确定如何调试(没有JS错误),有什么提示吗 顶点着色器: uniform mat4 u_modelViewProjMatrix; uniform mat4 u_normalMatrix; uniform vec3 lightDir; attribute vec3 vNormal; attribute vec4 vTexCoord;

我想将纹理投影到墙上或任何对象上。我根据这个Cg投影纹理贴图(ctrl-f“9.3”)修改了这个着色器,如下所示,但是我得到了一个空白的白色画布。我是着色器新手,不太确定如何调试(没有JS错误),有什么提示吗

顶点着色器:

uniform mat4 u_modelViewProjMatrix;
uniform mat4 u_normalMatrix;
uniform vec3 lightDir;

attribute vec3 vNormal;
attribute vec4 vTexCoord;
attribute vec4 vPosition;

varying float v_Dot;
varying vec2 v_texCoord;

void main()
{
    gl_Position = u_modelViewProjMatrix * vPosition;
    v_texCoord = vTexCoord.st * vPosition;
    vec4 transNormal = u_normalMatrix * vec4(vNormal, 1);
    v_Dot = max(dot(transNormal.xyz, lightDir), 0.0);
}
片段着色器:

uniform sampler2D sampler2d;

varying float v_Dot;
varying vec2 v_texCoord;

void main()
{
    vec4 color = texture2DProj(sampler2d,v_texCoord);
    gl_FragColor = vec4(color.xyz * v_Dot, color.a);
}

如果你的代码中有问题,我认为这是你计算v_texCoord的奇怪方式。你确定不想用矩阵代替vTexCoord吗?撇开这一点不谈,与我的预期相反,
texture2DProj
是在GLSL ES 1.0中定义的,它在语法上似乎是正确的,具有匹配的不同名称

当您没有可用的step调试器时,调试GLSL往往需要将中间值作为片段颜色输出。因此,您的测试可以是:

  • 调整片段着色器以输出恒定的颜色,如亮红色。如果您的几何体没有变为亮红色,那么您的程序链接不正确,您应该检查日志中的编译错误
  • 尝试将gl_FragColor设置为v_texCoord的适当调整版本。尝试从顶点着色器加载具有不同中间值的v_texCoord。观察输出,确保得到正确的数字类型
  • 尝试在不使用投影步骤的情况下进行纹理处理,以确保上载纹理并正确设置适当的均匀性

  • 再加上你能想到的任何其他变化。

    非常感谢,汤米。我通过使用texture2D并在顶点着色器中执行以下操作实现了它:vec4 clip=u_modelViewProjMatrix*vPosition;vec3-ndc=clip.xyz/clip.w;v_texCoord=0.5*(ndc.xy+1.0);