gpt4 book ai didi

webgl - 使用 WebGL 渲染全屏四边形

转载 作者:行者123 更新时间:2023-12-05 01:03:59 56 4
gpt4 key购买 nike

我有一个渲染场景的帧缓冲区,现在我想将它渲染到“全屏”四边形。如何设置我的相机以及我应该在我的顶点着色器中放置什么以便将帧缓冲区的纹理渲染到整个屏幕。

我试过像这样创建一个全屏四边形

var gl = this.gl;
var quad_vertex_buffer = gl.createBuffer();
var quad_vertex_buffer_data = new Float32Array([
-1.0, -1.0, 0.0,
1.0, -1.0, 0.0,
-1.0, 1.0, 0.0,
-1.0, 1.0, 0.0,
1.0, -1.0, 0.0,
1.0, 1.0, 0.0]);
gl.bufferData(quad_vertex_buffer, quad_vertex_buffer_data, gl.STATIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, quad_vertex_buffer);
gl.vertexAttribPointer(this.shaderProgram.vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
//gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
gl.drawArrays(gl.TRIANGLES,0, 6);

但它仍然使一切变黑。我可以遵循任何想法或示例/教程吗?

最佳答案

这真的没什么大不了的,一旦你了解了如何使用顶点缓冲区和着色器。然后你可以很容易地编写一个实用函数来完成它。如果您正在寻找引用,这是我通常使用的一个:

drawFullScreenQuad : function(shaderProgram) {

if (!shaderProgram)
{
utils.warning("Missing the shader program!");
return;
}

// Only created once
if (this.screenQuadVBO == null)
{
var verts = [
// First triangle:
1.0, 1.0,
-1.0, 1.0,
-1.0, -1.0,
// Second triangle:
-1.0, -1.0,
1.0, -1.0,
1.0, 1.0
];
this.screenQuadVBO = this.gl.createBuffer();
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.screenQuadVBO);
this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(verts), this.gl.STATIC_DRAW);
}

// Bind:
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.screenQuadVBO);
this.gl.enableVertexAttribArray(shaderProgram.vertexAttributes.vertexPositionNDC);
this.gl.vertexAttribPointer(shaderProgram.vertexAttributes.vertexPositionNDC, 2, this.gl.FLOAT, false, 0, 0);

// Draw 6 vertexes => 2 triangles:
this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);

// Cleanup:
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, null);
},

然后你可以像我一样在顶点着色器中即时计算纹理坐标:

顶点着色器:

precision lowp float;

// xy = vertex position in normalized device coordinates ([-1,+1] range).
attribute vec2 vertexPositionNDC;

varying vec2 vTexCoords;

const vec2 scale = vec2(0.5, 0.5);

void main()
{
vTexCoords = vertexPositionNDC * scale + scale; // scale vertex attribute to [0,1] range
gl_Position = vec4(vertexPositionNDC, 0.0, 1.0);
}

片段着色器:

precision mediump float;

uniform sampler2D colorMap;
varying vec2 vTexCoords;

void main()
{
gl_FragColor = texture2D(colorMap, vTexCoords);
}

需要注意的重要一点是标准化设备坐标(NDC)中的顶点,因此您只需将 [-1,1] 范围内的顶点传递并直接将它们转发到 gl_Position 而无需乘以一个投影矩阵。

关于webgl - 使用 WebGL 渲染全屏四边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24104939/

56 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com