WebGL没有在规范化的coords中绘制?

时间:2012-02-24 13:50:23

标签: javascript webgl

我写了一个简单的WebGL页面(好吧,尽可能简单)并且无法弄清楚为什么规范化坐标不起作用。也就是说,我试图通过两个三角形从(-0.5,-0.5)到(0.5,0.5)绘制一个正方形,而是得到一个离开屏幕的大矩形。

我完全不确定我做错了什么,所以我将它粘贴到了一个jsFiddle:

Link

注意我是如何正确定义顶点和索引的(右边?),我的着色器和片段程序就像它们一样简单。

为什么它是一个奇怪的大型屏幕外矩形?

2 个答案:

答案 0 :(得分:2)

好的,我终于得到了Freenode上#webgl中某人的帮助:<canvas>元素需要一个width和height属性,而我是通过CSS设置的。显然,实际的宽度和高度属性决定了OpenGL缓冲区的宽度和高度。

我无法在其他任何地方找到此文档,除了WebGL示例在canvas标记上具有width和height属性。

答案 1 :(得分:0)

与其他元素相同,显示的大小与其大小不同。例子:

将4x4 JPG显示为4x4像素

<img src="some4x4pixel.jpg" />

以16x16像素显示4x4 JPG

<img src="some4x4pixel.jpg" width="16" height="16" />

以16x16像素显示4x4 JPG

<img src="some4x4pixel.jpg" style="width:16px; height:16px;"/>

以容器的大小

显示4x4 JPG
<img src="some4x4pixel.jpg" style="width:100%; height:100%;"/>

以300x150像素显示300x150像素画布(默认大小)

 <canvas></canvas>

以4x4像素显示4x4画布

 <canvas width="4" height="4"></canvas>

以16x16像素显示4x4画布

 <canvas width="4" height="4" style="width:16px; height:16px;"/></canvas>

以容器的大小

显示4x4画布
 <canvas width="4" height="4" style="width:100%; height:100%;"/></canvas>

如果您正在使用3D并使用大多数3D数学库中常见的透视功能,您通常需要将宽高比设置为显示尺寸,而不是实际尺寸。

 // 45degrees, assumes math library uses radians
 var fieldOfView = Math.PI / 4;  

 // Use the size the canvas is displayed, NOT the size it actually is.
 var aspectRatio = canvas.clientWidth / canvas.clientHeight;

 var zNear = 0.1;
 var zFar = 1000;

 var matrix = someMathLibrary.perspective(fieldOfView, aspectRatio, zNear, zFar, ...)

如果您希望画布的大小与显示的大小相同,请使用

 canvas.width = canvas.clientWidth;
 canvas.height = canvas.clientHeight;

虽然请注意,WebGL画布不需要是您请求的大小,因为各种GPU都有大小限制。如果你想知道你实际获得的大小与你要求的大小相关,请检查

 gl.drawingBufferWidth
 gl.drawingBufferHeight

对于大多数3D应用程序使用的透视矩阵,画布的实际大小并不重要。对于某些类型的效果或对于2D,它通常很重要。

难以找到文档的原因是因为人们知道CSS决定所有元素的显示大小而不管其内容的实际大小,这是理所当然的。

https://www.google.com/webhp?sourceid=chrome-instant&ix=sea&ie=UTF-8&ion=1#sclient=psy-ab&hl=en&site=webhp&source=hp&q=canvas%20size%20css&pbx=1&oq=&aq=&aqi=&aql=&gs_sm=&gs_upl=&fp=f131b50fb368d7bf&ix=sea&ion=1&bav=on.2,or.r_gc.r_pw.r_cp.,cf.osb&biw=1629&bih=931