加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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
(最新13.04 Ubuntu)

我有一个问题 – 在这里发布的代码太多了,但这是本书的第一个例子 – 尽可能小,我不知道问题究竟在哪里.如果有人真的想帮忙的话会很酷 – 我会把它反馈给这本书的作者.是的,LoadShader在其他地方被发现并且可能是问题,但它应该是一个解决方案.当我无法获得编译的第一个例子时,对书中有任何信心是很难的.

在这里能找到它:
https://github.com/kestess/opengl8thfirstexample.git

解决方法

it’s way too much code to post here

并不是的.

试试这个:

#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上下文.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读