主要的目的还是要明白如何把值传输到GLSL,这个理论上是很简单的,但要了解一下,(GLSL)这个是opengl独家的语言,长的像C语言,要实现我们说的改变背景的颜色,其实比较简单,第一步,是在要在vertex的源文件中添加两个变量,为 in vec4 vColor,out vec4 fs_color; 这个in就是我们程序传入的值,out是给下一个步骤使用的,如果不清楚渲染的步骤可以百度一下,然后要在fragement源文件中添加 in vec4 fs_color; out vec4 color;fs_color不是直接从vertex中来的,理论上是从光栅化阶段的值,然后再通过调opengl的 glGetAttribLocation(g_program, “vColor”);获取vColor的位置值,再调用glVertexAttrib*进行赋值,然后就可以实现值的改变了。

依照 前一文的 红宝书第一个demo
方法一:

#include <stdio.h>
#include <string>
#include <vector>
#include <iostream>
using namespace std;//opengl headers!
#include <glew.h>
#include <glut.h>#pragma comment(lib,"glew32.lib")
#pragma comment(lib,"glut32.lib")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;GLuint LoadShaders()
{//generate shader namesGLuint vertShader = glCreateShader(GL_VERTEX_SHADER);GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);const char* vertShaderSrc ="#version 330 core \n layout (location = 0)  in vec4 vPosition; layout (location = 1)  in vec4 vColor; out vec4 fs_color; void main(){fs_color = vColor;gl_Position = vPosition;}";const char* fragShaderSrc ="#version 330 core \n in vec4 fs_color; out vec4 color; void main(){color = fs_color;}";GLint result = GL_FALSE;int logLength;//compile vertex shaderglShaderSource(vertShader, 1, &vertShaderSrc, NULL);glCompileShader(vertShader);glGetShaderiv(vertShader, GL_COMPILE_STATUS, &result);glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &logLength);vector<char> vertShaderError(logLength+1);glGetShaderInfoLog(vertShader, logLength, NULL, &vertShaderError[0]);cout << &vertShaderError[0] << endl;//compile fragment shaderglShaderSource(fragShader, 1, &fragShaderSrc, NULL);glCompileShader(fragShader);glGetShaderiv(fragShader, GL_COMPILE_STATUS, &result);glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &logLength);vector<char> fragShaderError(logLength+1);glGetShaderInfoLog(fragShader, logLength, NULL, &fragShaderError[0]);cout << &fragShaderError[0] << endl; //link the programGLuint program = glCreateProgram();glAttachShader(program, vertShader);glAttachShader(program, fragShader);glLinkProgram(program);glGetProgramiv(program, GL_LINK_STATUS, &result);glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);vector<char> programError(logLength > 1 ? logLength : 1);glGetProgramInfoLog(program, logLength, NULL, &programError[0]);cout << &programError[0] << endl;glDeleteShader(vertShader);glDeleteShader(fragShader);return program;
}#define BUFFER_OFFSET(a) ((void*)(a))GLuint g_program ;void Init()
{static const 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 }}; glCreateBuffers(NumBuffers, Buffers);glNamedBufferStorage(Buffers[ArrayBuffer]   ,  sizeof(vertices),vertices, 0);g_program  = LoadShaders();glUseProgram(g_program);glGenVertexArrays(NumVAOs, VAOs);glBindVertexArray(VAOs[Triangles]);glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);glVertexAttribPointer(vPosition, 2, GL_FLOAT,GL_FALSE, 0, BUFFER_OFFSET(0));glEnableVertexAttribArray(vPosition);}float g_fRed=1.0f;
float g_fGreen=0.0f;
float g_fBlue=0.0f;void display()
{static const float color[] = { (float)240/255, (float)240/255, (float)240/255,1.0};glClearBufferfv(GL_COLOR, 0, color);//we get the vColor keyGLuint vColor = glGetAttribLocation(g_program, "vColor");//we set the vColor key!glVertexAttrib4f(vColor,g_fRed,g_fGreen,g_fBlue,1.0f);glDrawArrays(GL_TRIANGLES, 0, NumVertices);glutSwapBuffers();
}void KeyCallBack(unsigned char key,int x,int y)
{static int i=0;i++;i = i%255;g_fRed= (float)i/255;;g_fGreen = 1-g_fRed;g_fBlue = 1-g_fRed/2;cout<<"key call back"<<endl;display();
}int _tmain(int argc, char* argv[])
{glutInit( &argc, argv );                                       //用于初始化GULT库glutInitDisplayMode ( GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA );  //设置初始显示模式glutInitWindowPosition (0,0);                                  //确定窗口的位置glutInitWindowSize  ( 900, 500 );                              //设置窗口大小glutCreateWindow    ( "OpenGlScreen" );                        //创建一个窗口标题glewInit();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("OOpenGL实现的版本号:%s\n",OpenGLVersion );printf("OGLU工具库版本:%s\n", gluVersion);Init ();//glutFullScreen      ( );          //Put Into Full ScreenglutDisplayFunc     ( display );    //注册一个绘图函数glutReshapeFunc     ( nullptr );    //设置投影的函数glutKeyboardFunc    ( KeyCallBack );    //键盘回调函数glutSpecialFunc     ( nullptr );    //设置当前窗口的特殊键盘回调。glutIdleFunc        ( nullptr );    //程序空闲时调用的函数glutMainLoop        ( );            // 进入GLUT事件处理循环return 0;
}

方法二:
shader.h


YShader::YShader(const char *vertShaderSrc, const char *fragShaderSrc)
{m_vertShader = LoadShader(vertShaderSrc,GL_VERTEX_SHADER);m_fragShader = LoadShader(fragShaderSrc,GL_FRAGMENT_SHADER);m_shaderProgram = LoadProgram(m_vertShader,m_fragShader);
}YShader::~YShader(void)
{UnloadShader();
}GLuint YShader::GetProgram()
{return m_shaderProgram;
}GLuint YShader::GetVertexShader()
{return m_vertShader;
}GLuint YShader::GetFragmentShader()
{return m_fragShader;
}GLuint YShader::LoadShader(const char *pShaderSrc,GLenum type)
{//generate shader namesGLuint Shader = glCreateShader(type);GLint result = GL_FALSE;int logLength;//compile vertex shaderglShaderSource(Shader, 1, &pShaderSrc, NULL);glCompileShader(Shader);glGetShaderiv(Shader, GL_COMPILE_STATUS, &result);glGetShaderiv(Shader, GL_INFO_LOG_LENGTH, &logLength);vector<char> vertShaderError(logLength+1);glGetShaderInfoLog(Shader, logLength, NULL, &vertShaderError[0]);cout << &vertShaderError[0] << endl;return Shader;
}GLuint YShader::LoadProgram(GLuint vertShader, GLuint fragShader)
{int logLength;GLint result = GL_FALSE;//link the programGLuint program = glCreateProgram();glAttachShader(program, vertShader);glAttachShader(program, fragShader);glLinkProgram(program);glGetProgramiv(program, GL_LINK_STATUS, &result);glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);vector<char> programError(logLength+1);glGetProgramInfoLog(program, logLength, NULL, &programError[0]);cout << &programError[0] << endl;return program;
}void YShader::UseProgram()
{glUseProgram(m_shaderProgram);
}void YShader::UnloadShader()
{glDeleteShader(m_vertShader);glDeleteShader(m_fragShader);glDeleteProgram(m_shaderProgram);
}

main

GLuint VAOs;
GLuint VB0;const GLuint NumVertices = 4;#define BUFFER_OFFSET(a) ((void*)(a))
const char* vertShaderSrc ="#version 330 core \n in vec4 vPosition; void main(){gl_Position = vPosition;}";
const char* fragShaderSrc ="#version 330 core \n out vec4 FragColor; uniform vec4 ourColor; void main(){FragColor = ourColor;}";
YShader *g_shader;void Init()
{g_shader = new YShader(vertShaderSrc,fragShaderSrc);g_shader->UseProgram();static const GLfloat vertices[NumVertices][2] ={{ -0.90, -0.85 }, // Triangle 1{ 0.90, -0.85 },{ 0.90, 0.85 },{ -0.90, 0.85 },}; glCreateBuffers(1, &VB0);                       //gpu create a bufferglNamedBufferStorage(VB0,  sizeof(vertices),    //copy buffer to gpu buffer areavertices, 0);glGenVertexArrays(1, &VAOs);glBindVertexArray(VAOs);glBindBuffer(GL_ARRAY_BUFFER, VB0);GLuint location = glGetAttribLocation(g_shader->GetProgram(),"vPosition");glVertexAttribPointer(location, 2, GL_FLOAT,GL_FALSE, 0, BUFFER_OFFSET(0));glEnableVertexAttribArray(location);}float g_fRed=1.0f;
float g_fGreen=0.0f;
float g_fBlue=0.0f;void display()
{static const float color[] = { (float)240/255, (float)240/255, (float)240/255,1.0};glClearBufferfv(GL_COLOR, 0, color);int vertexColorLocation = glGetUniformLocation(g_shader->GetProgram(), "ourColor");glUniform4f(vertexColorLocation,g_fRed,g_fGreen,g_fBlue, 1.0f);we get the vColor key//GLuint vColor = glGetAttribLocation(g_shader->GetProgram(), "vColor");we set the vColor key!//glVertexAttrib4f(vColor,g_fRed,g_fGreen,g_fBlue,1.0f);glDrawArrays(GL_QUADS, 0, NumVertices);glutSwapBuffers();
}void KeyCallBack(unsigned char key,int x,int y)
{static int i=0;i++;i = i%255;g_fRed= (float)i/255;;g_fGreen = 1-g_fRed;g_fBlue = 1-g_fRed/2;cout<<"key call back"<<endl;display();
}int _tmain(int argc, char* argv[])
{glutInit( &argc, argv );                                       //用于初始化GULT库glutInitDisplayMode ( GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA );  //设置初始显示模式glutInitWindowPosition (0,0);                                  //确定窗口的位置glutInitWindowSize  ( 900, 500 );                              //设置窗口大小glutCreateWindow    ( "OpenGlScreen" );                        //创建一个窗口标题glewInit();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("OOpenGL实现的版本号:%s\n",OpenGLVersion );printf("OGLU工具库版本:%s\n", gluVersion);Init ();//glutFullScreen      ( );          //Put Into Full ScreenglutDisplayFunc     ( display );    //注册一个绘图函数glutReshapeFunc     ( nullptr );    //设置投影的函数glutKeyboardFunc    ( KeyCallBack );    //键盘回调函数glutSpecialFunc     ( nullptr );    //设置当前窗口的特殊键盘回调。glutIdleFunc        ( nullptr );    //程序空闲时调用的函数glutMainLoop        ( );            // 进入GLUT事件处理循环return 0;
}

他们之间的基本上都是同样的原理,只不过用不了同的API来解决,但个人更偏向后一种,直接不能过顶点输入,而通过改变段着色就完成了~

当你随便长按一个键值就可以观察到颜色的变化了


更多文章:http://blog.csdn.net/what951006
powered by:小乌龟在大乌龟背上~

OpenGL入门(三) 改变绘制的颜色相关推荐

  1. OpenGL入门学习[二] 绘制简单的几何图形

    OpenGL入门学习[二] 本次课程所要讲的是绘制简单的几何图形,在实际绘制之前,让我们先熟悉一些概念. 一.点.直线和多边形 我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念 ...

  2. OpenGL入门北斗星点绘制

    ** OpenGL入门–北斗星点的绘制 C++代码 唯一遇到的问题就是glFlush()这个函数的问题 #include <GL/glut.h> #include<gl/GLU.h& ...

  3. WebGL入门(三十七)-绘制圆形的点

    绘制圆形的点 1. demo效果 2. 实现要点 2.1 绘制原理 2.1 绘制实现 3. demo代码 1. demo效果 如上图,绘制出了三个红色的小圆点 2. 实现要点 2.1 绘制原理 我们已 ...

  4. OpenGL入门:窗口开启、改变窗口背景颜色

    OpenGL入门 开启一个窗口: 运用OpenGL在窗口中绘制图形 显示一个窗口 利用OpenGL修改窗口背景颜色 改变颜色的闪烁 开启一个窗口: // Include for GLFW header ...

  5. openGL入门(三)绘制带对角线的正六边形,并在各个顶点上标明字母

    在上篇文章的基础上,本篇文章介绍如何继续在多边形的各个顶点加上字母.openGL本身不带有绘制字母的函数,是通过glutBitmapCharacter(font , character)绘制位图的算法 ...

  6. OpenGL入门学习[三]

    OpenGL入门学习[三] http://xiaxveliang.blog.163.com/blog/static/2970803420126246501930/ OpenGL入门学习[十一] 我们在 ...

  7. OpenGL入门(三)之着色器Shader

    本系列文章为Learn OpenGL个人学习总结! OpenGL入门(一)之认识OpenGL和创建Window OpenGL入门(二)之渲染管线pipeline,VAO.VBO和EBO OpenGL入 ...

  8. Opengl入门基础-shader着色器画方形并且填颜色

    文章目录 一.目的 二.结果 三.详细过程 下载 一.目的 opengl shader画方形并且填颜色 二.结果 成功画方形并用shader填充彩色 三.详细过程 https://blog.csdn. ...

  9. 海龟 (turtle) 画图实战任务(三):绘制彩虹条及绘制随机颜色、粗细、瓣数的雪花

    目录 1. 绘制彩虹线条 2. 绘制随机颜色.粗细.瓣数的雪花 为了让博友们加深对 turtle 库的印象以及能更加灵活地运用 turtle 库,故按照博主之前编写关于 turtle 文章顺序设置实战 ...

最新文章

  1. asp.net中长内容自动分页的实现
  2. Linux 小知识翻译 - 「命令行的提示符」
  3. 在PHP中创建和编辑Excel电子表格
  4. 腐蚀rust研究台抽奖_超级石化推荐:中石化青岛安工院专家分享延迟焦化装置的腐蚀风险分析!...
  5. CF1408G:Clusterization Counting(区间dp、克鲁斯卡尔重构树)
  6. phpmyadmin忘记mysql密码_忘记phpmyadmin密码怎么重置
  7. hadoop重启后 9000端口不在
  8. 最近安装了Netscape Navigator 9.0英文版,真好用!
  9. android AT指令获取SIM卡ICCID
  10. java程序设计实验指导书_java程序设计实验指导书-my
  11. android 仿站小工具,仿站小工具
  12. eXosip认证头域authentication
  13. win7计算机闪屏,win7电脑闪屏是什么原因
  14. dub的sdl配置文件中文帮助
  15. v-charts 如何更改文本颜色
  16. doom3 entitydef实体定义
  17. python动物农场小说网站爬虫_中文编程,用python编写小说网站爬虫
  18. 医院科室管理系统(IDEA开发)
  19. 2020年第三季度的垃圾邮件和网络钓鱼攻击分析
  20. 51单片机之 LCD1602液晶显示屏

热门文章

  1. 有哪些好的上门洗车小程序开发公司可以推荐?
  2. android安装服务apk下载,快爆工具服务app下载
  3. 计算机网络/谢希仁(第八版)第二章习题
  4. 对搜狐视频弹幕地域黑问题的一次社工经历
  5. 老师辞职的理由(爆笑)
  6. 【解读】微信指数将刮起怎样的旋风?
  7. 查缺补漏!最快最简单的排序(1)
  8. strcasecmp php,php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
  9. 软件工程导论复试问题总结
  10. Terra深陷死亡螺旋 创始人宣布增发10亿新LUNA代币计划 能否重塑市场信心?