【发布时间】:2013-08-18 10:43:19
【问题描述】:
我一直在尝试在 webgl 上渲染一些非常基本的东西,我已经将渲染简化为我能想到的最基本的东西,以便找出问题所在,但我什至无法绘制出于某种原因,简单的正方形。我真正想要渲染的场景更复杂,但正如我所说,我已经将其简化以试图找到问题,但仍然没有运气。我希望有人可以看一下并找到我缺少的任何东西,我认为这是某个时候的设置步骤。
我正在运行的 gl 命令(由 webgl 检查器报告,没有错误)是:
- clearColor(0,0,0,1)
- clearDepth(1)
- 清除(COLOR_BUFFER_BIT | DEPTH_BUFFER_BIT)
- 使用程序([程序 2])
- bindBuffer(ARRAY_BUFFER, [缓冲区 5])
- vertexAttribPointer(0, 2, FLOAT, false, 0, 0)
- drawArrays(TRIANGLES, 0, 6)
那里正在使用的缓冲区(缓冲区 5)设置如下:
bufferData(ARRAY_BUFFER, [-1,-1,1,-1,-1,1,-1,1,1,-1,1,1], STATIC_DRAW)
而节目(Program 2)数据为:
- LINK_STATUS 正确
- VALIDATE_STATUS 错误
- DELETE_STATUS 错误
- ACTIVE_UNIFORMS 0
- ACTIVE_ATTRIBUTES 1
顶点着色器:
#ifdef GL_ES
precision highp float;
#endif
attribute vec2 aPosition;
void main(void) {
gl_Position = vec4(aPosition, 0, 1);
}
片段着色器:
#ifdef GL_ES
precision highp float;
#endif
void main(void) {
gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}
我认为可能相关的其他状态:
- CULL_FACE 错误
- CULL_FACE_MODE 返回
- FRONT_FACE 逆时针
- 混合错误
- DEPTH_TEST 错误
- 视口 0, 0 640 x 480
- SCISSOR_TEST 错误
- SCISSOR_BOX 0, 0 640 x 480
- COLOR_WRITEMASK true,true,true,true
- DEPTH_WRITEMASK 为真
- STENCIL_WRITEMASK 0xffffffff
- FRAMEBUFFER_BINDING 为空
我希望从该设置/命令中看到的是一个红色四边形占据了整个剪辑空间,但我看到的只是清除的屏幕,因为 drawArrays 似乎没有做任何事情。谁能发现我错过了什么?任何有关如何调试它的提示也非常受欢迎!
【问题讨论】:
-
不确定这是否真的是问题所在,但不管您在顶点着色器中是否缺少世界空间 -> 剪辑空间转换。基本上,您需要将输入顶点数据与特殊的(模型-视图-)投影矩阵相乘。见this。
-
@elmov 感谢您的意见。我的着色器最初是这样做的,但我删除它试图排除问题出在我的转换矩阵上。 AFAIK,当顶点从-1到+1时,上面的代码应该在剪辑空间内渲染得很好(我相信剪辑空间正好是从(-1,-1)到(1,1),你知道吗?这是错的吗?