第一个OpenGL程序

开发环境
平台: CentOS6.8
编译器: gcc 4.4.7
OpenGL: 2.1
源代码: http://opengl-redbook.com/Code/oglpg-8th-edition.zip
《OpenGL编程指南》第8版封面就说了,使用的是OpenGL4.3。没有找到支持更高OpenGL版本的驱动(本人电脑硬件很差。。。)。所以遇到的第一个问题就是兼容性问题。
使用g++编译第一章示例程序,按照报错信息一步步修改。vgl.h,LoadShaders.h,LoadShaders.cpp从源代码的include文件夹拷贝过来。最后出来的窗口没有出现红色三角形。估计是着色器语法错误,导致渲染失败。参照一些资料,改了着色器后,程序运行成功!
以下是示例程序最终源代码:

//triangles.cpp
#include <stdio.h>
#include <iostream>
using namespace std;
#include "vgl.h"
#include "LoadShaders.h"

//0 -> Triangles
//1 -> NumVAOs
enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers };


enum Attrib_IDs { vPosition = 0 };
//VAOs: vertex array object
GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];
const GLuint NumVertices = 6;
//---------------------------------------------------------------------
//
// init
//
void init(void){
    glGenVertexArrays(NumVAOs, VAOs);//VAOs: input & output var
    glBindVertexArray(VAOs[Triangles]);
    GLfloat vertices[NumVertices][2] = {
        { -0.90, -0.90 }, // Triangle 1
        { 0.85, -0.90 },
        { -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);
    ShaderInfo shaders[] = {
        { GL_VERTEX_SHADER, "triangles.vert" },
        { GL_FRAGMENT_SHADER, "triangles.frag" },
        { GL_NONE, NULL }
    };
    GLuint program = LoadShaders(shaders);
    glUseProgram(program);
    glVertexAttribPointer(vPosition, 2, GL_FLOAT,
            GL_FALSE, 0, BUFFER_OFFSET(0));
    glEnableVertexAttribArray(vPosition);
}
//---------------------------------------------------------------------
//
// display
//
    void
display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBindVertexArray(VAOs[Triangles]);
    glDrawArrays(GL_TRIANGLES, 0, NumVertices);

    glFlush();
}
//---------------------------------------------------------------------
//
// main
//
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(512, 512);
//  const char * v = (const char *)glGetString(GL_VERSION);
  glutInitContextVersion(2, 1);
//  glutInitContextProfile(GLUT_CORE_PROFILE);
    glutCreateWindow(argv[0]);
    if (glewInit()) {
        cerr << "Unable to initialize GLEW ...exiting" << endl;
        exit(EXIT_FAILURE);
    }
    init();
    glutDisplayFunc(display);
    glutMainLoop();
}
triangles.vert
#version 120

//layout(location = 0) in vec4 vPosition;
attribute vec4 vPosition;
void main(){
    gl_Position = vPosition;
}
//triangles.frag
#version 120 
void main(){
    gl_FragColor = vec4(1,0,0,1);
}

最后附上一个程序,可以查看本机点OpenGL版本信息。

#include <stdio.h>
#include <GL/glut.h>

int main(int argc, char** argv)
{
    glutInit(&argc,argv);
    //显示模式初始化
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
    //定义窗口大小
    glutInitWindowSize(300,300);
    //定义窗口位置
    glutInitWindowPosition(100,100);
    //创建窗口
    glutCreateWindow("OpenGL Version");
    const GLubyte* name = glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字
    const GLubyte* biaoshifu = glGetString(GL_RENDERER); //返回一个渲染器标识符,通常是个硬件平台
    const GLubyte* OpenGLVersion =glGetString(GL_VERSION); //返回当前OpenGL实现的版本号
    const GLubyte* gluVersion= gluGetString(GLU_VERSION); //返回当前GLU工具库版本
    printf("OpenGL实现厂商的名字:%s\n", name);
    printf("渲染器标识符:%s\n", biaoshifu);
    printf("OpenGL实现的版本号:%s\n",OpenGLVersion );
    printf("GLU工具库版本:%s\n", gluVersion);
    return 0;
}

以上源代码来自某博客,具体网址忘了,在此表示感谢!

参考资料:
1. http://www.opengl-tutorial.org/
2. http://www.prinmath.com/csci5229/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值