2012-12-22 153 views
1

我一直在使用WebGL,但似乎我无法管理显示纹理了。片段着色器的输出始终为黑色(轮廓可见)。什么会导致片段着色器中的纹理变黑?

我知道这个问题可能会发生与纹理不是两个幂。不幸的是我的(256x256)。此外,我确实在某些时候让他们工作了(但我改变了太多以回溯问题)。

编辑: 我已经大大简化了我的程序,并由gman使用WebGL Inspector(伟大的提示btw)建议。 纹理从WebGL Inspector中看起来很好。 我正要张贴整个代码时,我注意到,虽然

var textureUniformLocation = gl.getUniformLocation(shaderProgram, "uSampler"); 
console.log(textureUniformLocation); 
gl.activeTexture(gl.TEXTURE0); 
gl.bindTexture(gl.TEXTURE_2D, neheTexture); 
gl.uniform1i(textureUniformLocation, 0); 

不起作用,console.log(...)后加入alert(textureUniformLocation);使得纹理看起来... 我现在想知道的是:我的显卡在做药物?

编辑2:它会工作,如果我把一个简单的字符串在警报以及。

我能想到的唯一原因是会出现内存管理不良或多个执行线程。这两种情况都不是这里的情况。什么样的事情甚至可以在JavaScript中导致这样的问题?

任何帮助将不胜感激。

+0

尝试将其更改为'gl_FragColor = vec4(texture2D(...)。rgb,1.0);'只是为了确保它不是您的alpha值为零? – gman

+0

也是同样的问题,如果在之前的纹理工作之后就可以工作的话,会感到惊讶。 – DrBearhands

+0

我开始添加一些'console.log()'语句。打印统一的位置(确保它们都不为空)。也许试试'WebGL Inspector'。将'gl_FragColor'设置为像'vec4(0,1,0,1)'这样的常量会使绿色变成正确的?你有不止一个着色器程序?有没有在正确的程序上调用'gl.useProgram'?从一个可用的示例开始,开始将代码粘贴到它中,直到它停止工作。 – gman

回答

0

如果检查员看到纹理,那么...他们是可能是 loading。 Chrome和Firefox的行为是否一致?报告的有关alert()的行为使我认为渲染可能发生在纹理加载之前,并且alert()会导致刷新(纹理加载之后)。

还要确保这不是顶点属性(如顶点颜色或退化UV坐标)的问题。

+0

它们根本不在Chrome中加载,Firefox中的行为如上所述。 WebGL Inspector在两者中显示纹理。 也许图像还不加载,即异步发生AFAIK。任何方式使主'线'在绘图之前等待? – DrBearhands

+0

是的,就是这样。在调用draw函数之前,图像尚未完成加载。我曾经有移动物体,所以我会多次渲染,所以以前没有显示这个问题。我想我会在我跟随的教程中发布警告。 – DrBearhands

相关问题