我是计算机图形学的新手。我的任务是在没有着色器的情况下绘制形状。但正如我从互联网上了解到的那样,应该使用LIGHTS来绘制美丽的形状。但我无法使用它们,因为我无法渲染我的法线。简而言之,我有 3D 顶点、索引、法线。我正在使用顶点缓冲区对象来渲染顶点和索引。所以我的代码是:
glGenBuffers(3, vertexObjectBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexObjectBuffer[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * numVertex * 3 , vertex, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
//glGenBuffers(1, &vertexObjectBuffer[1]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vertexObjectBuffer[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(float) * numIndicies * 3 , indices, GL_STATIC_DRAW);
问题是如果我使用顶点缓冲区对象但没有着色器,如何发送法线?
如果您使用的是 OpenGL ES 2.x 及更高版本,则必须使用着色器;没有着色器 = 没有渲染。所有输入都由着色器定义,因此要传入法线,只需设置一个新的顶点属性,其中包含法线数据,并通过另一个对glVertexAttribPointer()
的调用将其传入。听起来你刚刚开始,所以先让基本的着色器工作;)
如果您使用的是 OpenGL ES 1.1,则不需要着色器,但必须使用固定函数渲染管道。如果要指定单个顶点(实际上没有(,则可以通过glNormal3[x|f]()
设置每个顶点法线,如果要传入顶点缓冲区对象,则可以通过glNormalPointer()
设置每个顶点法线。
老实说,学习着色器;它们并不是那么复杂,学习会教你想要每个现代图形API所需的技能,所以这是一个非常有用的技能。