OpenGL入门(三) 改变绘制的颜色
主要的目的还是要明白如何把值传输到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入门(三) 改变绘制的颜色相关推荐
- OpenGL入门学习[二] 绘制简单的几何图形
OpenGL入门学习[二] 本次课程所要讲的是绘制简单的几何图形,在实际绘制之前,让我们先熟悉一些概念. 一.点.直线和多边形 我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念 ...
- OpenGL入门北斗星点绘制
** OpenGL入门–北斗星点的绘制 C++代码 唯一遇到的问题就是glFlush()这个函数的问题 #include <GL/glut.h> #include<gl/GLU.h& ...
- WebGL入门(三十七)-绘制圆形的点
绘制圆形的点 1. demo效果 2. 实现要点 2.1 绘制原理 2.1 绘制实现 3. demo代码 1. demo效果 如上图,绘制出了三个红色的小圆点 2. 实现要点 2.1 绘制原理 我们已 ...
- OpenGL入门:窗口开启、改变窗口背景颜色
OpenGL入门 开启一个窗口: 运用OpenGL在窗口中绘制图形 显示一个窗口 利用OpenGL修改窗口背景颜色 改变颜色的闪烁 开启一个窗口: // Include for GLFW header ...
- openGL入门(三)绘制带对角线的正六边形,并在各个顶点上标明字母
在上篇文章的基础上,本篇文章介绍如何继续在多边形的各个顶点加上字母.openGL本身不带有绘制字母的函数,是通过glutBitmapCharacter(font , character)绘制位图的算法 ...
- OpenGL入门学习[三]
OpenGL入门学习[三] http://xiaxveliang.blog.163.com/blog/static/2970803420126246501930/ OpenGL入门学习[十一] 我们在 ...
- OpenGL入门(三)之着色器Shader
本系列文章为Learn OpenGL个人学习总结! OpenGL入门(一)之认识OpenGL和创建Window OpenGL入门(二)之渲染管线pipeline,VAO.VBO和EBO OpenGL入 ...
- Opengl入门基础-shader着色器画方形并且填颜色
文章目录 一.目的 二.结果 三.详细过程 下载 一.目的 opengl shader画方形并且填颜色 二.结果 成功画方形并用shader填充彩色 三.详细过程 https://blog.csdn. ...
- 海龟 (turtle) 画图实战任务(三):绘制彩虹条及绘制随机颜色、粗细、瓣数的雪花
目录 1. 绘制彩虹线条 2. 绘制随机颜色.粗细.瓣数的雪花 为了让博友们加深对 turtle 库的印象以及能更加灵活地运用 turtle 库,故按照博主之前编写关于 turtle 文章顺序设置实战 ...
最新文章
- asp.net中长内容自动分页的实现
- Linux 小知识翻译 - 「命令行的提示符」
- 在PHP中创建和编辑Excel电子表格
- 腐蚀rust研究台抽奖_超级石化推荐:中石化青岛安工院专家分享延迟焦化装置的腐蚀风险分析!...
- CF1408G:Clusterization Counting(区间dp、克鲁斯卡尔重构树)
- phpmyadmin忘记mysql密码_忘记phpmyadmin密码怎么重置
- hadoop重启后 9000端口不在
- 最近安装了Netscape Navigator 9.0英文版,真好用!
- android AT指令获取SIM卡ICCID
- java程序设计实验指导书_java程序设计实验指导书-my
- android 仿站小工具,仿站小工具
- eXosip认证头域authentication
- win7计算机闪屏,win7电脑闪屏是什么原因
- dub的sdl配置文件中文帮助
- v-charts 如何更改文本颜色
- doom3 entitydef实体定义
- python动物农场小说网站爬虫_中文编程,用python编写小说网站爬虫
- 医院科室管理系统(IDEA开发)
- 2020年第三季度的垃圾邮件和网络钓鱼攻击分析
- 51单片机之 LCD1602液晶显示屏