c – OpenGL拒绝绘制三角形

c – OpenGL拒绝绘制三角形,第1张

概述我试图在OpenGL的窗口中绘制一个大的三角形.我的程序编译并运行,但我的窗口只有一个黑屏. 我已经检查并仔细检查了多个教程,看起来我的步骤是正确的……我错过了一些明显的东西吗? 以下是该计划的全部内容: #include <stdlib.h>#include <stdio.h>#include <GL/glew.h>#include <GLUT/glut.h>GLuint VBO; 我试图在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以来已经有一段时间了,但我知道一旦你开始使用特定版本或更新版本,你将不得不提供自己的模型视图投影矩阵,这是需要考虑的事情.

总结

以上是内存溢出为你收集整理的c – OpenGL拒绝绘制三角形全部内容,希望文章能够帮你解决c – OpenGL拒绝绘制三角形所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1227632.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存