You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WebGL顶点着色器内定义顶点位置并绘制三角形?

无需JS传递顶点数据,直接在WebGL顶点着色器中定义顶点绘制三角形

目标是直接在顶点着色器内自定义顶点位置,不依赖JavaScript的new Float32Array(positions)传递顶点数据,绘制出位置精准的三角形。以下是修正关键错误后的完整可运行代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WebGL 示例</title>
    <style>
        canvas {
            border: 1px solid black;
        }
    </style>
</head>
<body>
    <canvas id="canvas" width="400" height="400"></canvas>
    <script>
        window.onload = function() {
            var canvas = document.getElementById('canvas');
            var gl = canvas.getContext('webgl');

            const shaderSource = {
                vertex: `
                          uniform vec2 screenSize; // 屏幕尺寸uniform变量

                          void main(void) {
                              // 定义顶点数组
                              vec3 vertices[3];
                              vertices[0] = vec3(0.0, 1.0, 0.0);
                              vertices[1] = vec3(-1.0, -1.0, 0.0);
                              vertices[2] = vec3(1.0, -1.0, 0.0);

                              // 根据屏幕尺寸调整顶点
                              for (int i = 0; i < 3; i++) {
                                  vertices[i].x *= screenSize.x / screenSize.y; // 根据宽高比调整x坐标
                              }

                              // 创建存储最终顶点的vec3变量
                              vec3 finalPosition = vec3(0.0);

                              // 通过gl_VertexID索引顶点数组赋值
                              finalPosition = vertices[gl_VertexID];

                              // 计算最终位置
                              gl_Position = vec4(finalPosition, 1.0);
                          }


                `,
                fragment: `
                    void main(void) {
                        gl_FragColor = vec4(0, 0.8, 0, 1);
                    }
                `
            };

            var vertShader = gl.createShader(gl.VERTEX_SHADER);
            gl.shaderSource(vertShader, shaderSource.vertex);
            gl.compileShader(vertShader);

            var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
            gl.shaderSource(fragShader, shaderSource.fragment);
            gl.compileShader(fragShader);

            var shaderProgram = gl.createProgram();
            gl.attachShader(shaderProgram, vertShader);
            gl.attachShader(shaderProgram, fragShader);
            gl.linkProgram(shaderProgram);
            gl.useProgram(shaderProgram);

            // 设置screenSize uniform变量
            const screenSizeLoc = gl.getUniformLocation(shaderProgram, 'screenSize');
            gl.uniform2f(screenSizeLoc, canvas.width, canvas.height);

            // 清除画布
            gl.clearColor(1.0, 1.0, 1.0, 1.0);
            gl.clear(gl.COLOR_BUFFER_BIT);

            // 绘制三角形
            gl.drawArrays(gl.TRIANGLES, 0, 3);
        };
    </script>
</body>
</html>

原代码的两处关键错误及修正:

  • 未设置screenSize uniform变量的值:修正后通过JavaScript获取该uniform的位置,传入画布的宽高参数,确保顶点x坐标能根据画布宽高比适配,避免三角形变形
  • 顶点着色器中finalPosition赋值语法错误:修正为使用WebGL内置变量gl_VertexID索引预先定义的顶点数组,为每个绘制的顶点分配正确的位置数据

内容的提问来源于stack exchange,提问作者alex hernandez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 06:43:16