我花了几天时间构建一个使用简单照明在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假设只获取顶点索引?
答案 0 :(得分:1)
我认为我没有正确理解glDrawElements。没有正常指数,照明是如何工作的?是glDrawElements假设只获取顶点索引?
在OpenGL中,每个属性没有单独的索引。就OpenGL而言,顶点是所有属性的n元组,如位置,颜色,法线向量,tex坐标,等等。
对于您的立方体,您将需要至少24个顶点。只有8个角位置,但每个角都连接到3个不同的面,每个面都有不同的法线。这意味着,每个角落需要 3 个不同的顶点,所有顶点都在同一位置,但所有顶点都不同于正常方向。
因此,glDrawElements
仅适用于一个索引数组,这是同时使用所有已启用的顶点属性数组的索引。您的normal_indices
数组根本就没用过。如果它仍然按预期工作,您的正常数据恰好以正确的方式组织。