使用颜色缓冲区时WebGL渲染失败

A--

<!doctype html>
<html>

<body>
<canvas id ="ctx" width = "300" height = "300"></canvas> 
    <script>
        //Getting Webgl Context

        var ctx = document.getElementById("ctx");
        var webgl = ctx.getContext("experimental-webgl");

        /*Creating Shader*/

        //Vertex Code
        var vertexCode =
        'attribute vec3 coordinates;'+
        'attribute vec3 color;'+
        'varying vec3 vColor;'+
        'void main(void) {' +
           ' gl_Position = vec4(coordinates, 1.0);' +
           'vColor = color;'+
        '}';

        //Creating Shader Object    
        var vertexShader = webgl.createShader(webgl.VERTEX_SHADER);

        //Assigning the Source
        webgl.shaderSource(vertexShader, vertexCode);

        //Compiling the Source
        webgl.compileShader(vertexShader);

        //Fragment Shader Code 
         var fragmentCode ='precision mediump float;'+
        'varying vec3 vColor;'+
        'void main(void) {'+
           'gl_FragColor = vec4(vColor, 1.);'+
        '}';

        //Creating Shader Object    
        var fragmentShader = webgl.createShader(webgl.FRAGMENT_SHADER);

        //Assigning the Source
        webgl.shaderSource(fragmentShader, fragmentCode);

        //Compiling the Source
        webgl.compileShader(fragmentShader);

        //Creating Program to store Shader
        var shaderProgram = webgl.createProgram();

        //Attaching the shaders
        webgl.attachShader(shaderProgram, vertexShader);
        webgl.attachShader(shaderProgram, fragmentShader);

        //linking the Program
        webgl.linkProgram(shaderProgram);

        //using the Program
        webgl.useProgram(shaderProgram);

        //Defining geometry
        var vertices = [
        -0.5,0.5,0.0,
        -0.5,-0.5,0.0,
        0.5,-0.5,0.0,
        0.5,0.5,0.0
     ];

     var colors = [0,0,1, 1,0,0, 0,1,0, 1,0,1,];

     indices = [3,2,1,3,1,0];

        //Creating a Buffer
        var VextexBuffer = webgl.createBuffer();
        var IndexBuffer = webgl.createBuffer();
        var colorBuffer = webgl.createBuffer();

        //Binding the Buffer
        webgl.bindBuffer(webgl.ARRAY_BUFFER, VextexBuffer);
        webgl.bindBuffer(webgl.ELEMENT_ARRAY_BUFFER, IndexBuffer);
        webgl.bindBuffer(webgl.ARRAY_BUFFER, colorBuffer);

        //Buffer Data
        webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(vertices), webgl.STATIC_DRAW);
        webgl.bufferData(webgl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), webgl.STATIC_DRAW);
        webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(colors), webgl.STATIC_DRAW);

        /*Associating the shaders to bufferObject*/

        //Getting attribute location
        var coord = webgl.getAttribLocation(shaderProgram,"coordinates");
        var color = webgl.getAttribLocation(shaderProgram, "color");

        //pointing an attribute to the currently bound VBO
        webgl.vertexAttribPointer(coord, 3, webgl.FLOAT, false ,0,0);
        webgl.vertexAttribPointer(color, 3, webgl.FLOAT, false ,0,0);

        //enabling the attributes
        webgl.enableVertexAttribArray(coord);
        webgl.enableVertexAttribArray(color);
        //Unbind Array


        /*Drawing the Triangle*/

        //Clearing the Colour
        webgl.clearColor(.5,.5,.5,1);

        //Enabling the depth test
        webgl.enable(webgl.DEPTH_TEST);

        //Clearing colour nuffer bit
        webgl.clear(webgl.COLOR_BUFFER_BIT);

        //Setting a viewport
        webgl.viewport(0,0,ctx.width,ctx.height);

        //Draw the triangle
            webgl.drawElements(webgl.TRIANGLES,indices.length,webgl.UNSIGNED_SHORT,0);

    </script>
</body>
</html>

如果我删除颜色缓冲区以及与之相关的所有内容,则代码将运行,但使用颜色缓冲区后,我只会看到灰色画布,而没有看到其他内容。

此外,Chrome控制台不会显示任何错误或警告。请帮我。

J

您正在用颜色覆盖顶点位置:

 webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(vertices), webgl.STATIC_DRAW);
 webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(colors), webgl.STATIC_DRAW);

在任何给定时间只能有一个缓冲区域为每种类型(ARRAY_BUFFERELEMENT_ARRAY_BUFFER),所以流动是结合一个缓冲区,并设置随后用于建立顶点属性指针其数据特定缓冲液,然后进行到下一个缓冲器:

// setup positions
var VextexBuffer = webgl.createBuffer();
webgl.bindBuffer(webgl.ARRAY_BUFFER, VextexBuffer);
webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(vertices), webgl.STATIC_DRAW);
var coord = webgl.getAttribLocation(shaderProgram,"coordinates");
webgl.vertexAttribPointer(coord, 3, webgl.FLOAT, false ,0,0);

// setup indices
var IndexBuffer = webgl.createBuffer();
webgl.bindBuffer(webgl.ELEMENT_ARRAY_BUFFER, IndexBuffer);
webgl.bufferData(webgl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), webgl.STATIC_DRAW);

// setup colors
var colorBuffer = webgl.createBuffer();
webgl.bindBuffer(webgl.ARRAY_BUFFER, colorBuffer);
webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(colors), webgl.STATIC_DRAW);
var color = webgl.getAttribLocation(shaderProgram, "color");
webgl.vertexAttribPointer(color, 3, webgl.FLOAT, false ,0,0);

对于使用多个不同缓冲区并打算实时的应用程序,流程是在初始化阶段创建和设置缓冲区,然后仅绑定缓冲区并在动画循环期间设置顶点属性指针。

<!doctype html>
<html>

<body>
<canvas id ="ctx" width = "300" height = "300"></canvas> 
    <script>
        //Getting Webgl Context

        var ctx = document.getElementById("ctx");
        var webgl = ctx.getContext("experimental-webgl");

        /*Creating Shader*/

        //Vertex Code
        var vertexCode =
        'attribute vec3 coordinates;'+
        'attribute vec3 color;'+
        'varying vec3 vColor;'+
        'void main(void) {' +
           ' gl_Position = vec4(coordinates, 1.0);' +
           'vColor = color;'+
        '}';

        //Creating Shader Object    
        var vertexShader = webgl.createShader(webgl.VERTEX_SHADER);

        //Assigning the Source
        webgl.shaderSource(vertexShader, vertexCode);

        //Compiling the Source
        webgl.compileShader(vertexShader);

        //Fragment Shader Code 
         var fragmentCode ='precision mediump float;'+
        'varying vec3 vColor;'+
        'void main(void) {'+
           'gl_FragColor = vec4(vColor, 1.);'+
        '}';

        //Creating Shader Object    
        var fragmentShader = webgl.createShader(webgl.FRAGMENT_SHADER);

        //Assigning the Source
        webgl.shaderSource(fragmentShader, fragmentCode);

        //Compiling the Source
        webgl.compileShader(fragmentShader);

        //Creating Program to store Shader
        var shaderProgram = webgl.createProgram();

        //Attaching the shaders
        webgl.attachShader(shaderProgram, vertexShader);
        webgl.attachShader(shaderProgram, fragmentShader);

        //linking the Program
        webgl.linkProgram(shaderProgram);

        //using the Program
        webgl.useProgram(shaderProgram);

        //Defining geometry
        var vertices = [
        -0.5,0.5,0.0,
        -0.5,-0.5,0.0,
        0.5,-0.5,0.0,
        0.5,0.5,0.0
     ];

     var colors = [0,0,1, 1,0,0, 0,1,0, 1,0,1,];

     indices = [3,2,1,3,1,0];

       // setup positions
       var VextexBuffer = webgl.createBuffer();
       webgl.bindBuffer(webgl.ARRAY_BUFFER, VextexBuffer);
       webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(vertices), webgl.STATIC_DRAW);
       var coord = webgl.getAttribLocation(shaderProgram,"coordinates");
       webgl.vertexAttribPointer(coord, 3, webgl.FLOAT, false ,0,0);

       // setup indices
       var IndexBuffer = webgl.createBuffer();
       webgl.bindBuffer(webgl.ELEMENT_ARRAY_BUFFER, IndexBuffer);
       webgl.bufferData(webgl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), webgl.STATIC_DRAW);

       // setup colors
       var colorBuffer = webgl.createBuffer();
       webgl.bindBuffer(webgl.ARRAY_BUFFER, colorBuffer);
       webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(colors), webgl.STATIC_DRAW);
       var color = webgl.getAttribLocation(shaderProgram, "color");
       webgl.vertexAttribPointer(color, 3, webgl.FLOAT, false ,0,0);

        //enabling the attributes
        webgl.enableVertexAttribArray(coord);
        webgl.enableVertexAttribArray(color);
        //Unbind Array


        /*Drawing the Triangle*/

        //Clearing the Colour
        webgl.clearColor(.5,.5,.5,1);

        //Enabling the depth test
        webgl.enable(webgl.DEPTH_TEST);

        //Clearing colour nuffer bit
        webgl.clear(webgl.COLOR_BUFFER_BIT);

        //Setting a viewport
        webgl.viewport(0,0,ctx.width,ctx.height);

        //Draw the triangle
            webgl.drawElements(webgl.TRIANGLES,indices.length,webgl.UNSIGNED_SHORT,0);

    </script>
</body>
</html>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

WebGL 渲染缓冲区

来自分类Dev

在WebGL中渲染缓冲区副本时是否可以指定颜色?

来自分类Dev

WebGL:同时使用纹理和颜色缓冲区

来自分类Dev

WebGL-从内存渲染缓冲区

来自分类Dev

示例默认 WebGL 颜色缓冲区

来自分类Dev

使用WebGL2通过Alpha混合渲染到帧缓冲区时的伪像

来自分类Dev

使用 Cocoa 渲染像素缓冲区

来自分类Dev

是否可以使用带有立方贴图颜色附件的深度渲染缓冲区?

来自分类Dev

如何在绑定顶点数组对象和缓冲区数据以在渲染时动态绘制时编写通用的 webgl 渲染循环?

来自分类Dev

无法使用lwjgl和顶点缓冲区渲染纹理

来自分类Dev

使用统一缓冲区对象的批处理渲染

来自分类Dev

如何在Elm的WebGL库中将渲染缓冲区用作纹理

来自分类Dev

如何在Elm的WebGL库中将渲染缓冲区用作纹理

来自分类Dev

在webgl中共享缓冲区

来自分类Dev

通过WebGL支持模板缓冲区

来自分类Dev

Webgl:销毁或重用缓冲区/纹理?

来自分类Dev

WebGL中的模板缓冲区

来自分类Dev

在 Flex 中使用多个缓冲区时,如何避免令牌在缓冲区之间拆分

来自分类Dev

SDL2-如何使用一个缓冲区而不是两个缓冲区进行渲染?

来自分类Dev

在OpenGL ES中使用深度和模具渲染缓冲区附件作为帧缓冲区

来自分类Dev

绘制渲染缓冲区对象的内容

来自分类Dev

渲染BufferedGraphics缓冲区的特定区域

来自分类Dev

在渲染过程的不同子过程中写入相同的颜色缓冲区

来自分类Dev

如何更改vim缓冲区的颜色?

来自分类Dev

PyOpenGL回读缓冲区颜色

来自分类Dev

PyOpenGL回读缓冲区颜色

来自分类Dev

Emacs ERC缓冲区无颜色

来自分类Dev

使用glReadPixels(...)读取帧缓冲区时精度较低

来自分类Dev

使用套接字时重用读取缓冲区

Related 相关文章

  1. 1

    WebGL 渲染缓冲区

  2. 2

    在WebGL中渲染缓冲区副本时是否可以指定颜色?

  3. 3

    WebGL:同时使用纹理和颜色缓冲区

  4. 4

    WebGL-从内存渲染缓冲区

  5. 5

    示例默认 WebGL 颜色缓冲区

  6. 6

    使用WebGL2通过Alpha混合渲染到帧缓冲区时的伪像

  7. 7

    使用 Cocoa 渲染像素缓冲区

  8. 8

    是否可以使用带有立方贴图颜色附件的深度渲染缓冲区?

  9. 9

    如何在绑定顶点数组对象和缓冲区数据以在渲染时动态绘制时编写通用的 webgl 渲染循环?

  10. 10

    无法使用lwjgl和顶点缓冲区渲染纹理

  11. 11

    使用统一缓冲区对象的批处理渲染

  12. 12

    如何在Elm的WebGL库中将渲染缓冲区用作纹理

  13. 13

    如何在Elm的WebGL库中将渲染缓冲区用作纹理

  14. 14

    在webgl中共享缓冲区

  15. 15

    通过WebGL支持模板缓冲区

  16. 16

    Webgl:销毁或重用缓冲区/纹理?

  17. 17

    WebGL中的模板缓冲区

  18. 18

    在 Flex 中使用多个缓冲区时,如何避免令牌在缓冲区之间拆分

  19. 19

    SDL2-如何使用一个缓冲区而不是两个缓冲区进行渲染?

  20. 20

    在OpenGL ES中使用深度和模具渲染缓冲区附件作为帧缓冲区

  21. 21

    绘制渲染缓冲区对象的内容

  22. 22

    渲染BufferedGraphics缓冲区的特定区域

  23. 23

    在渲染过程的不同子过程中写入相同的颜色缓冲区

  24. 24

    如何更改vim缓冲区的颜色?

  25. 25

    PyOpenGL回读缓冲区颜色

  26. 26

    PyOpenGL回读缓冲区颜色

  27. 27

    Emacs ERC缓冲区无颜色

  28. 28

    使用glReadPixels(...)读取帧缓冲区时精度较低

  29. 29

    使用套接字时重用读取缓冲区

热门标签

归档