使用 regl 我正在尝试实现一个非常简单的drawRect()
函数,该函数最终将能够在屏幕空间中传递 x、y、宽度、高度(屏幕左上角的原点 0,0)
这是我到目前为止所拥有的:
https://codesandbox.io/s/nn9qvxom4l
const regl = require('regl')();
const mat4 = require('gl-mat4');
var drawRect = regl({
frag: `
precision mediump float;
uniform vec4 color;
void main() {
gl_FragColor = color;
}`,
vert: `
precision mediump float;
attribute vec2 position;
uniform vec2 offset;
uniform vec2 scale;
uniform float viewportWidth;
uniform float viewportHeight;
uniform mat4 projection;
void main() {
// windows ratio scaling factor.
float r = (viewportWidth) / (viewportHeight);
gl_Position = projection * vec4(position.xy * scale, 0, 1);
}`,
attributes: {
position: [
[-1, -1], //tri 1 bottom left
[1, 1],
[-1, 1],
[-1, -1],
[1, -1],
[1, 1]
]
},
uniforms: {
offset: regl.prop('offset'),
scale: regl.prop('scale'),
color: regl.prop('color'),
viewportWidth: regl.context('viewportWidth'),
viewportHeight: regl.context('viewportHeight'),
projection: ({ viewportWidth, viewportHeight }) => {
//glm::ortho(0.0f, 800.0f, 0.0f, 600.0f, 0.1f, 100.0f);
//ortho(out:mat4, left, right, bottom, top, near, far)
// this makes everything blank
var m = mat4.ortho(
[],
0,
viewportWidth,
0,
viewportHeight,
0.1,
100.0
);
console.log(m);
return m;
}
},
depth: {
enable: false
},
cull: {
enable: true
},
count: 6,
viewport: {
x: 0,
y: 0,
width: window.innerWidth,
height: window.innerHeight
}
});
regl.clear({
color: [0, 0, 0, 255],
depth: 1
});
// all these coordinates are in clip-space* right now (* I think)
// but I'd like to be able to pass in screen-space coordinates
drawRect([
{
offset: [0, 0],
scale: [0.002, 0.002],
color: [1, 0.2, 0.2, 1]
},
{
offset: [0, -0.2],
scale: [0.2, 0.05],
color: [1, 0.2, 1, 1]
},
{
offset: [0, 0],
scale: [0.5, 0.5],
color: [0.2, 0.2, 1, 1]
}
]);
目前它绘制了一个空白屏幕(我猜是由于投影矩阵裁剪或将所有内容移动到视口之外)。如果您从顶点着色器中移除投影或在投影属性中使用单位矩阵,则它会再次呈现蓝色方块。
所以我的问题是:
- 我在这里做错了什么?为什么我的正交投影不起作用?
- 将来我将如何调试它,以便我可以“看到”结果坐标以及它们是如何错误的?
我已经阅读了一些 SO 问题、OpenGL 书籍和博客,但我被困在这里,因为这似乎应该可行。
相关资源:
https://unspecified.wordpress.com/2012/06/21/calculating-the-gluperspective-matrix-and-other-opengl-matrix-maths/ https://developer.mozilla.org/en-US/docs/ Web/API/WebGL_API/WebGL_model_view_projection https://webglfundamentals.org/webgl/lessons/webgl-2d-matrices.html WebGL 等距投影 想要一个 OpenGL 2D 示例(VC++,画一个矩形) http://songho.ca/opengl /gl_transform.html
编辑:固定 viewportWidth 在正交投影中使用了两次。这修复了一个空白屏幕,但是原点现在位于左下角而不是左上角。切换正射投影的参数会再次导致黑屏。