c – OpenGL拒绝绘制三角形
我试图在OpenGL的窗口中绘制一个大的三角形.我的程序编译并运行,但我的窗口只有一个黑屏.
我已经检查并仔细检查了多个教程,看起来我的步骤是正确的……我错过了一些明显的东西吗? 以下是该计划的全部内容: #include <stdlib.h> #include <stdio.h> #include <GL/glew.h> #include <GLUT/glut.h> GLuint VBO; struct vector { float _x; float _y; float _z; vector() { } vector(float x,float y,float z) { _x = x; _y = y; _z = z; } }; void render() { glClear(GL_COLOR_BUFFER_BIT); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER,VBO); glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0); glDrawArrays(GL_TRIANGLES,3); glDisableVertexAttribArray(0); glutSwapBuffers(); } void create_vbo() { vector verts[3]; verts[0] = vector(-1.0f,-1.0f,0.0f); verts[1] = vector(1.0f,0.0f); verts[2] = vector(0.0f,1.0f,0.0f); glGenBuffers(1,&VBO); glBindBuffer(GL_ARRAY_BUFFER,VBO); glBufferData(GL_ARRAY_BUFFER,sizeof(verts),verts,GL_STATIC_DRAW); } int main(int argc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA); glutInitWindowSize(1024,768); glutInitWindowPosition(100,100); glutCreateWindow("Triangle Test"); glutDisplayFunc(render); glewInit(); glClearColor(0.0f,0.0f,0.0f); create_vbo(); glutMainLoop(); return 0; } 更新:事实证明,没有“程序”(即编译的着色器文件)以这种方式绘制会产生未定义的行为(您的图形卡越新,它就越有可能工作). 因为我的卡是正确的,并且只支持OpenGL 2.1,所以找到一个合适的着色器示例有点困难 – 似乎在OpenGL的演变过程中不同阶段有很多不同的教程. 我的顶点着色器(整个文件): void main() { gl_Position = ftransform(); } 我的片段着色器(整个文件): void main() { gl_FragColor = vec4(0.4,0.4,0.8,1.0); } 我使用了this OpenGL Tutorial Site的LoadShaders函数来创建程序,现在,我也可以看到三角形! (感谢@ chbaker0指出我正确的方向.) 解决方法
我不知道这是否会对你有所帮助,但在你的create_vbo()函数中你有:
glBufferData(GL_ARRAY_BUFFER,GL_STATIC_DRAW); 试试这个: glBufferData( GL_ARRAY_BUFFER,sizeof( verts[0] * 3 ),&verts[0],GL_STATIC_DRAW ); 在此函数调用之后,将此函数调用添加到create_vbo()函数的末尾 // This MUST BE LAST! Used to Stop The Buffer! glBindBuffer( GL_ARRAY_BUFFER,0 ); 我很难看到你的错误.在我的项目中,我确实有一些vbos,但我也使用vaos.我的代码能够在OpenGL 2.0 – 4.5中工作,但是对于旧版本,由于API中已弃用的功能,因此逻辑上存在分歧.我也不使用过剩.我希望这有帮助. 我注意到的另一件事是你注意你的顶点缠绕顺序吗?这意味着OpenGL在CCW订单或CW订单中使用它们?背面剔除是打开还是关闭?在设置和配置OpenGL上下文时,需要考虑很多元素.自从我使用旧版本的OpenGL以来已经有一段时间了,但我知道一旦你开始使用特定版本或更新版本,你将不得不提供自己的模型视图投影矩阵,这是需要考虑的事情. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |