Opengl学习程序之顶点颜色和位置设置

来源:互联网 发布:成都云计算公司排名 编辑:程序博客网 时间:2024/04/30 19:41

gouraud.vert

#version 330 corelayout(location = 0) in vec4 vPosition;layout(location = 1) in vec4 vColor;out vec4 color;void main(){    color =vColor;    gl_Position = vPosition;}

gouraud.frag

#version 330 corein vec4 color;out vec4 fColor;void main(){    fColor = color;}

实现程序:

#include "stdafx.h"#include<iostream>using namespace std;#include "vgl.h"#include "LoadShaders.h"enum VAO_IDs{Triangles,NumVAOs};enum Buffer_IDs{ArrayBuffer,NumBuffers};enum Attrib_IDs{vPosition = 0,vColor = 1};GLuint VAOs[NumVAOs];GLuint Buffers[NumBuffers];const GLuint NumVertices = 6;void init(void){    glGenVertexArrays(NumVAOs, VAOs);    glBindVertexArray(VAOs[Triangles]);    struct VertexData{        GLubyte color[4];        GLfloat position[4];    };    VertexData vertices[NumVertices] = {        { { 255, 0, 0, 255 }, {-0.90,-0.90} }, //三角形1        { { 0, 255, 0, 255 }, {0.85,-0.90} },        { { 0, 0, 255, 255 }, {-0.90,0.85} },        { { 10, 10, 10, 255 }, { 0.90, -0.85 } }, //三角形2        { { 100, 100, 100, 255 }, { 0.90, 0.85 } },        { { 255, 255, 255, 255 }, {-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, "gouraud.vert" },        { GL_FRAGMENT_SHADER, "gouraud.frag" },        {GL_NONE,NULL}    };    GLuint program = LoadShaders(shaders);    glUseProgram(program);    glVertexAttribPointer(vColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(VertexData), BUFFER_OFFSET(0));    glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, sizeof(VertexData), BUFFER_OFFSET(sizeof(vertices[0].color)));    glEnableVertexAttribArray(vColor);    glEnableVertexAttribArray(vPosition);}void display(void){    glClear(GL_COLOR_BUFFER_BIT);    glBindVertexArray(VAOs[Triangles]);    glDrawArrays(GL_TRIANGLES, 0, NumVertices);    glFlush();}int main(int argc, char** argv){    glutInit(&argc, argv);    glutInitDisplayMode(GLUT_RGBA);    glutInitWindowSize(512, 512);    glutInitContextVersion(3, 3);    glutInitContextProfile(GLUT_CORE_PROFILE);    glutCreateWindow(argv[0]);    glewExperimental = GL_TRUE;    if (glewInit())    {        cerr << "Unable to initialize GLEW ... exiting" << endl;        exit(EXIT_FAILURE);    }    init();    glutDisplayFunc(display);    glutMainLoop();}

就是画了2个三角形!很简单的代码。

关于渐变颜色的解释:
光栅化:
OpenGL的管线中,顶点着色阶段(顶点、细分、和几何着色)以及片元着色阶段之间的过程称作光栅化,它的主要职责是判断屏幕空间的哪个部分被几何体(点,线、三角形)所覆盖。如果知道这些区域,再与输入的顶点数据相结合,那么光栅化阶段就可以对片元着色器中的每个变量数值进行线性差值计算,然后将结果输入到片元着色器当中。如果我们对颜色数据执行这一线性差值的过程,那么它在计算机图形学中有一个特殊的名字:Gouraud着色。颜色,表面法线,纹理映射过程中需要用到的纹理坐标等都是需要在几何图元之间进行插值的数值。

0 0