【发布时间】:2019-01-26 08:20:01
【问题描述】:
我正在使用 WebGL 绘制一个简单的平截头体几何。我试着给前面上色 (小)背面(大)面红色,侧面白色。
这就是它的外观。请注意,较小的表面离眼睛较近,较大的表面离眼睛较远。不要被这张图片所迷惑。看起来着色器选择为离眼睛最远的侧面着色,而忽略前面的脸。
我应该如何使这项工作正常进行?
以下是我的着色器设置: 深度缓冲区在初始化期间被清除并且从未使用过。
function init(){
// Retrieve <canvas> element
var canvas = document.getElementById('webgl');
// Get the rendering context for WebGL
gl = getWebGLContext(canvas);
if (!gl) {
console.log("lib1.js: init() failed to get WebGL rendering context 'gl'\n");
console.log("from the HTML-5 Canvas object named 'canvas'!\n\n");
return;
}
// Initialize shaders
if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
console.log('lib1.js: init() failed to intialize shaders.');
return;
}
bufferSetup(gl);
// Set the background-clearing color and enable the depth test
gl.clearColor(0.0, 0.0, 0.0, 1.0); // black!
gl.enable(gl.DEPTH_TEST);
gl.enable(gl.CULL_FACE); // draw the back side of triangles
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
}
感谢丹尼斯指出这一点!我还尝试打开和关闭gl.CULL_FACE,并尝试了gl.BACK 和gl.FRONT。它们都不能正常工作。
gl.disable(gl.CULL_FACE);
// gl.cullFace(gl.BACK)
【问题讨论】:
-
答案取决于您的着色器代码和您指定顶点的方式,请将这些详细信息添加到您的问题中。
-
@idoby谢谢!我已将这些添加到问题中
-
试试 gl.cullFace(gl.BACK); / gl.cullFace(gl.FRONT) 或玩剔除以查看这是否有助于解决您的问题。很可能您得到了“错误的方式”的顶点,这意味着渲染器将正面视为您认为是正面的三角形的另一面。
-
@Denis 谢谢!我正在尝试这个,抱歉我没有在描述中添加这个。我尝试打开和关闭 gl.CULL_FACE,还尝试了 gl.BACK 和 gl.FRONT。它们都不起作用。
-
“请注意,较小的表面离眼睛较近,较大的表面离眼睛较远。” - 你使用透视投影吗?越远的表面是否越大,但由于透视投影的原因似乎更小?