OpenGL如何知道如何使用glDrawElements()的普通数据?

时间:2015-07-26 22:05:50

标签: opengl graphics

我花了几天时间构建一个使用简单照明在OpenGL中渲染立方体的工作示例

我有:

function Player(ID) {
    this.t;
    this.y = 170;
    this.speed = -3;
    this.move = function move() {
        if (this.y > 1 && this.y < 421) {
            this.y += this.speed;
        }
        else if (this.y < 1) {
            this.y = 2;
            this.speed = 3;
        }
        else {
            this.y = 420;
            this.speed = -3;
        }
        document.getElementById(ID).style.top=this.y + "px";
        this.t = setTimeout("this.move()",10);
    }
    this.back = function back() {
        if (this.speed < 0) 
            this.speed = 3;
        else
            this.speed = -3;
    }
}

var player = new Player("player");

(1)我设置了我的VBO

function Ball(ID) {
    this.t;
    this.x = 350;
    this.y = 260;
    this.left = true;
    this.bot = true;
    this.acc = 5;
    this.move = function move() {
        if (this.bot)
            this.y -= 3;
        else if (!this.bot)
            this.y += 3;
        if (this.left)
            this.x -= 3;
        else if (!this.left)
            this.x += 3;
        document.getElementById(ID).style.top = this.y + "px";
        document.getElementById(ID).style.left = this.x + "px";
        this.t = setTimeout("this.move()",10);
    }
}

var ball = new Ball("ball");

(2)我启用了我的顶点指针

function move() {
    player.move();
    ball.move();
}

function back() {
    player.back();
}

(3)我还设置了索引缓冲区

vertices = {...};
normals = {...};
vertex_indices = {...};
normal_indices = {...};

然后在我的渲染方法中调用glBufferSubData(GL_ARRAY_BUFFER, 0, vertSize, &vertices[0]); // vertices glBufferSubData(GL_ARRAY_BUFFER, vertSize, normSize, &normals[0]); // normals

glEnableVertexAttribArray(0);
glVertexAttribPointer(0,..)

glEnableVertexAttribArray(1);
glVertexAttribPointer(1,..)

我没有在任何地方传递正常索引,但一切似乎都正常。

我认为我没有正确理解glDrawElements。没有正常指数,照明是如何工作的?是glDrawElements假设只获取顶点索引?

1 个答案:

答案 0 :(得分:1)

  

我认为我没有正确理解glDrawElements。没有正常指数,照明是如何工作的?是glDrawElements假设只获取顶点索引?

在OpenGL中,每个属性没有单独的索引。就OpenGL而言,顶点是所有属性的n元组,​​如位置,颜色,法线向量,tex坐标,等等。

对于您的立方体,您将需要至少24个顶点。只有8个角位置,但每个角都连接到3个不同的面,每个面都有不同的法线。这意味着,每个角落需要 3 个不同的顶点,所有顶点都在同一位置,但所有顶点都不同于正常方向。

因此,glDrawElements仅适用于一个索引数组,这是同时使用所有已启用的顶点属性数组的索引。您的normal_indices数组根本就没用过。如果它仍然按预期工作,您的正常数据恰好以正确的方式组织。