c – OpenGL Red Book 8th – 第一个例子给出黑盒子(Ubuntu)
发布时间:2020-12-16 09:46:10 所属栏目:百科 来源:网络整理
导读:在经过许多网站建议的许多改动之后,从第8版OpenGL编程指南编译的第一个示例程序之后,我是一个黑盒子的自豪拥有者 – 从前几个小时开始有了很大的改进,但承认我看到它是令人尴尬的大多数情况下使用调试器,除非程序出现基本错误,否则我不知道在哪里查看.其他Op
在经过许多网站建议的许多改动之后,从第8版OpenGL编程指南编译的第一个示例程序之后,我是一个黑盒子的自豪拥有者 – 从前几个小时开始有了很大的改进,但承认我看到它是令人尴尬的大多数情况下使用调试器,除非程序出现基本错误,否则我不知道在哪里查看.其他OpenGL示例已经运行,但我正在尝试在新书中运行第一个示例.
我的盒子: john@zerofluid:~/Downloads$glxinfo | grep OpenGL OpenGL vendor string: NVIDIA Corporation OpenGL renderer string: GeForce GT 610/PCIe/SSE2 OpenGL version string: 4.3.0 NVIDIA 313.30 OpenGL shading language version string: 4.30 NVIDIA via Cg compiler OpenGL extensions: Linux zerofluid 3.8.0-26-generic#38-Ubuntu SMP Mon Jun 17 21:43:33 UTC 2013 x86_64 x86_64 x86_64 GNU / Linux 我有一个问题 – 在这里发布的代码太多了,但这是本书的第一个例子 – 尽可能小,我不知道问题究竟在哪里.如果有人真的想帮忙的话会很酷 – 我会把它反馈给这本书的作者.是的,LoadShader在其他地方被发现并且可能是问题,但它应该是一个解决方案.当我无法获得编译的第一个例子时,对书中有任何信心是很难的. 在这里能找到它: 解决方法
并不是的. 试试这个: #include <GL/glew.h> #include <GL/freeglut.h> #include <vector> #include <iostream> struct Program { static GLuint Load( const char* vert,const char* geom,const char* frag ) { GLuint prog = glCreateProgram(); if( vert ) AttachShader( prog,GL_VERTEX_SHADER,vert ); if( geom ) AttachShader( prog,GL_GEOMETRY_SHADER,geom ); if( frag ) AttachShader( prog,GL_FRAGMENT_SHADER,frag ); glLinkProgram( prog ); CheckStatus( prog ); return prog; } private: static void CheckStatus( GLuint obj ) { GLint status = GL_FALSE,len = 10; if( glIsShader(obj) ) glGetShaderiv( obj,GL_COMPILE_STATUS,&status ); if( glIsProgram(obj) ) glGetProgramiv( obj,GL_LINK_STATUS,&status ); if( status == GL_TRUE ) return; if( glIsShader(obj) ) glGetShaderiv( obj,GL_INFO_LOG_LENGTH,&len ); if( glIsProgram(obj) ) glGetProgramiv( obj,&len ); std::vector< char > log( len,'X' ); if( glIsShader(obj) ) glGetShaderInfoLog( obj,len,NULL,&log[0] ); if( glIsProgram(obj) ) glGetProgramInfoLog( obj,&log[0] ); std::cerr << &log[0] << std::endl; exit( -1 ); } static void AttachShader( GLuint program,GLenum type,const char* src ) { GLuint shader = glCreateShader( type ); glShaderSource( shader,1,&src,NULL ); glCompileShader( shader ); CheckStatus( shader ); glAttachShader( program,shader ); glDeleteShader( shader ); } }; #define GLSL(version,shader) "#version " #version "n" #shader const char* vert = GLSL ( 400 core,layout( location = 0 ) in vec4 vPosition; void main() { gl_Position = vPosition; } ); const char* frag = GLSL ( 400 core,out vec4 fColor; void main() { fColor = vec4( 0.0,0.0,1.0,1.0 ); } ); enum VAO_IDs { Triangles,NumVAOs }; enum Buffer_IDs { ArrayBuffer,NumBuffers }; enum Attrib_IDs { vPosition = 0 }; GLuint VAOs[NumVAOs]; GLuint Buffers[NumBuffers]; const GLuint NumVertices = 6; void init(void) { glGenVertexArrays(NumVAOs,VAOs); glBindVertexArray(VAOs[Triangles]); GLfloat vertices[NumVertices][2] = { { -0.90,-0.90 },// Triangle 1 { 0.85,{ -0.90,0.85 },{ 0.90,-0.85 },// Triangle 2 { 0.90,0.90 },{ -0.85,0.90 } }; glGenBuffers(NumBuffers,Buffers); glBindBuffer(GL_ARRAY_BUFFER,Buffers[ArrayBuffer]); glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW); GLuint program = Program::Load( vert,frag ); glUseProgram(program); glVertexAttribPointer(vPosition,2,GL_FLOAT,GL_FALSE,(void*)(0) ); glEnableVertexAttribArray(vPosition); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(VAOs[Triangles]); glDrawArrays(GL_TRIANGLES,NumVertices); glutSwapBuffers(); } int main(int argc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE ); glutInitWindowSize(512,512); glutInitContextVersion(4,0); glutInitContextProfile(GLUT_CORE_PROFILE); glutCreateWindow(argv[0]); glewExperimental = GL_TRUE; if( GLEW_OK != glewInit() ) exit(EXIT_FAILURE); init(); glutDisplayFunc(display); glutMainLoop(); } 如果您使用#version 400核心,没有理由要求4.3上下文. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |