SHIYUEDYX的专栏

我只是做个笔记。

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

gouraud.vert

#version 330 core
layout(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 core
in 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着色。颜色,表面法线,纹理映射过程中需要用到的纹理坐标等都是需要在几何图元之间进行插值的数值。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SHIYUEDYX/article/details/55190541
文章标签: opengl
个人分类: opengl
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭