一、RGB三原色

回想一下初中物理知识:

  1. 三原色:自然界中所有的颜色都可以用红、绿、蓝(RGB)这三种颜色频率的不同强度组合而得,白色包含了所有颜色
  2. 能看到一个物体的颜色,是这个物体(Reflected)反射的颜色,换句话说,就是不能被当前物体吸收(Absorb)的颜色
  3. 之所以能看到五彩斑斓的世界,是因为存在光源(发光的物体),否则将是完全的黑暗
  4. 结合②③,颜色从光源到我们的眼睛,大致就是这样一个过程:光源发出光线 → 照射到物体上 → 物体反射所有光源中存在,但不能被其吸收的颜色

计算机如何表示颜色(应该算是个很基础的东西了):

  1. RGBA:RGB代表3原色,一般在(0, 255)的范围内,越大对应颜色越深,A代表透明度,可以转换成对应浮点数,例如0.5就等于128(HEX格式:#FFB6C1FF  →  对应RGBA格式:255,182,193, 255)
  2. 由①可见,计算机能表现的颜色数量其实是有限的,总共(256 * 256 * 256)种不同颜色,这也是所谓的 8-bit 采样,现在部分支持 10 - bit 采样,在这种情况下能表现出总共 (1024 * 1024 * 1024) 种不同颜色

二、光照场景

回想 OpenGL基础5:第一个正方形 这一章

在这一章的时候,还没有接触到纹理,在颜色方面,也只是随便给他赋了个颜色

在此之后用了纹理,也就是简简单单的把颜色这一属性去掉了

现在重新考虑颜色这一属性,不再简单给物体随便赋颜色了,而是直接开始模拟光照!以给与物体一个真实的“颜色”,在此之前,先用前面的知识生成一个这样的场景:

其中白色的正方体是光源,珊瑚红色的正方体是物体

白色光源的着色器代码如下(LightFShader.txt 和 LightVShader):

#version 330 core
out vec4 color;
void main()
{color = vec4(1.0f);
}/#version 330 core
layout (location = 0) in vec3 position;
uniform mat4 model;             //模型矩阵
uniform mat4 view;              //观察矩阵
uniform mat4 projection;        //投影矩阵
void main()
{gl_Position = projection * view * model * vec4(position, 1.0);
}

珊瑚红物体的着色器如下(ObjFShader.txt 和 ObjVShader):

#version 330 core
out vec4 color;
uniform vec3 objectColor;
uniform vec3 lightColor;
in vec2 texIn;
uniform sampler2D texOutA;
void main()
{color = vec4(lightColor * objectColor, 1.0f);
}/#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec2 texture;
out vec2 texIn;
uniform mat4 model;             //模型矩阵
uniform mat4 view;              //观察矩阵
uniform mat4 projection;        //投影矩阵
void main()
{gl_Position = projection * view * model * vec4(position, 1.0);//texIn = vec2(texture.x, 1.0f - texture.y);   //暂时屏蔽纹理
}

对于物体的顶点着色器,我们定义了两个uniform变量,分别代表着物体颜色和光照颜色

当我们把光源的颜色与物体的颜色相乘,所得到的就是这个物体所反射该光源的颜色(也就是我们感知到的颜色)

接下来就是主代码(Camera.h 和 Shader.h未改变,可以从前面的章节中找到):

#include<iostream>
#include<opengl/glew.h>
#define GLEW_STATIC
#include<GLFW/glfw3.h>
#include"Camera.h"
#include<glm/glm.hpp>
#include<glm/gtc/matrix_transform.hpp>
#include<glm/gtc/type_ptr.hpp>
#include"Shader.h"
#include<opengl/freeglut.h>
#include<SOIL.h>bool keys[1024];
Camera camera;
GLfloat lastX, lastY;
bool firstMouse = true;
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
void mouse_callback(GLFWwindow* window, double xpos, double ypos);
void cameraMove();
glm::vec3 lightPos(1.2f, 1.0f, 2.0f);
const GLuint WIDTH = 800, HEIGHT = 600;int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);glfwMakeContextCurrent(window);glfwSetKeyCallback(window, key_callback);glfwSetCursorPosCallback(window, mouse_callback);glfwSetScrollCallback(window, scroll_callback);glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);glewExperimental = GL_TRUE;glewInit();int width, height;glfwGetFramebufferSize(window, &width, &height);glViewport(0, 0, width, height);Shader shaderObj("ObjVShader.txt", "ObjFShader.txt");Shader shaderLight("LightVShader.txt", "LightFShader.txt");GLfloat vertices[] = {-0.5f, -0.5f, -0.5f,  0.0f, 0.0f,0.5f, -0.5f, -0.5f,  1.0f, 0.0f,0.5f,  0.5f, -0.5f,  1.0f, 1.0f,0.5f,  0.5f, -0.5f,  1.0f, 1.0f,-0.5f,  0.5f, -0.5f,  0.0f, 1.0f,-0.5f, -0.5f, -0.5f,  0.0f, 0.0f,-0.5f, -0.5f,  0.5f,  0.0f, 0.0f,0.5f, -0.5f,  0.5f,  1.0f, 0.0f,0.5f,  0.5f,  0.5f,  1.0f, 1.0f,0.5f,  0.5f,  0.5f,  1.0f, 1.0f,-0.5f,  0.5f,  0.5f,  0.0f, 1.0f,-0.5f, -0.5f,  0.5f,  0.0f, 0.0f,-0.5f,  0.5f,  0.5f,  1.0f, 0.0f,-0.5f,  0.5f, -0.5f,  1.0f, 1.0f,-0.5f, -0.5f, -0.5f,  0.0f, 1.0f,-0.5f, -0.5f, -0.5f,  0.0f, 1.0f,-0.5f, -0.5f,  0.5f,  0.0f, 0.0f,-0.5f,  0.5f,  0.5f,  1.0f, 0.0f,0.5f,  0.5f,  0.5f,  1.0f, 0.0f,0.5f,  0.5f, -0.5f,  1.0f, 1.0f,0.5f, -0.5f, -0.5f,  0.0f, 1.0f,0.5f, -0.5f, -0.5f,  0.0f, 1.0f,0.5f, -0.5f,  0.5f,  0.0f, 0.0f,0.5f,  0.5f,  0.5f,  1.0f, 0.0f,-0.5f, -0.5f, -0.5f,  0.0f, 1.0f,0.5f, -0.5f, -0.5f,  1.0f, 1.0f,0.5f, -0.5f,  0.5f,  1.0f, 0.0f,0.5f, -0.5f,  0.5f,  1.0f, 0.0f,-0.5f, -0.5f,  0.5f,  0.0f, 0.0f,-0.5f, -0.5f, -0.5f,  0.0f, 1.0f,-0.5f,  0.5f, -0.5f,  0.0f, 1.0f,0.5f,  0.5f, -0.5f,  1.0f, 1.0f,0.5f,  0.5f,  0.5f,  1.0f, 0.0f,0.5f,  0.5f,  0.5f,  1.0f, 0.0f,-0.5f,  0.5f,  0.5f,  0.0f, 0.0f,-0.5f,  0.5f, -0.5f,  0.0f, 1.0f};GLuint VBO, VAO, texture;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glGenTextures(1, &texture);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBindTexture(GL_TEXTURE_2D, texture);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)0);glEnableVertexAttribArray(0);/*glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));glEnableVertexAttribArray(1);int picWidth, picHeight;glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);unsigned char* image = SOIL_load_image("Texture/wood.jpg", &picWidth, &picHeight, 0, SOIL_LOAD_RGB);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, picWidth, picHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, image);glGenerateMipmap(GL_TEXTURE_2D);SOIL_free_image_data(image);glBindTexture(GL_TEXTURE_2D, 0);*/GLuint lightVAO;glGenVertexArrays(1, &lightVAO);glBindVertexArray(lightVAO);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)0);//VBO数据已经绑定且我们就用之前的顶点数据,所以无需再管理VBOglEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);glEnable(GL_DEPTH_TEST);while (!glfwWindowShouldClose(window)){glfwPollEvents();glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);glClear(GL_DEPTH_BUFFER_BIT);cameraMove();//glBindTexture(GL_TEXTURE_2D, texture);shaderObj.Use();GLint objectColorLoc = glGetUniformLocation(shaderObj.Program, "objectColor");GLint lightColorLoc = glGetUniformLocation(shaderObj.Program, "lightColor");glUniform3f(objectColorLoc, 1.0f, 0.5f, 0.31f);     //物体反射颜色glUniform3f(lightColorLoc, 1.0f, 1.0f, 1.0f);       //光源:默认为白色glm::mat4 model = glm::mat4(1.0f);glm::mat4 view = glm::mat4(1.0f);glm::mat4 projection = glm::mat4(1.0f);model = glm::rotate(model, glm::radians(57.0f), glm::vec3(-0.5f, 1.0f, 0.0f));view = camera.GetViewMatrix();projection = glm::perspective(glm::radians(camera.Zoom), (GLfloat)WIDTH / (GLfloat)HEIGHT, 0.1f, 100.0f);GLint modelLoc = glGetUniformLocation(shaderObj.Program, "model");GLint viewLoc = glGetUniformLocation(shaderObj.Program, "view");GLint projLoc = glGetUniformLocation(shaderObj.Program, "projection");glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection));glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 36);//glBindTexture(GL_TEXTURE_2D, 0);shaderLight.Use();model = glm::translate(glm::mat4(1.0f), lightPos);model = glm::scale(model, glm::vec3(0.2f));modelLoc = glGetUniformLocation(shaderLight.Program, "model");viewLoc = glGetUniformLocation(shaderLight.Program, "view");projLoc = glGetUniformLocation(shaderLight.Program, "projection");glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection));glBindVertexArray(lightVAO);glDrawArrays(GL_TRIANGLES, 0, 36);glBindVertexArray(0);glfwSwapBuffers(window);}glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glfwTerminate();return 0;
}GLfloat deltaTime = 0.0f;
GLfloat lastFrame = 0.0f;
void cameraMove()
{GLfloat currentFrame = glfwGetTime();deltaTime = currentFrame - lastFrame;lastFrame = currentFrame;GLfloat cameraSpeed = 1.0f * deltaTime;if (keys[GLFW_KEY_W])camera.ProcessKeyboard(Camera_Movement(FORWARD), deltaTime);if (keys[GLFW_KEY_S])camera.ProcessKeyboard(Camera_Movement(BACKWARD), deltaTime);if (keys[GLFW_KEY_A])camera.ProcessKeyboard(Camera_Movement(LEFT), deltaTime);if (keys[GLFW_KEY_D])camera.ProcessKeyboard(Camera_Movement(RIGHT), deltaTime);
}void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)glfwSetWindowShouldClose(window, GL_TRUE);if (action == GLFW_PRESS)           //如果当前是按下操作keys[key] = true;else if (action == GLFW_RELEASE)            //松开键盘keys[key] = false;
}void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
{camera.ProcessMouseScroll(yoffset);
}void mouse_callback(GLFWwindow* window, double xpos, double ypos)
{if (firstMouse){lastX = xpos;lastY = ypos;firstMouse = false;}GLfloat xoffset = xpos - lastX;GLfloat yoffset = lastY - ypos;lastX = xpos;lastY = ypos;GLfloat sensitivity = 0.05;xoffset *= sensitivity;yoffset *= sensitivity;camera.ProcessMouseMovement(xoffset, yoffset);
}

OpenGL基础17:颜色相关推荐

  1. OpenGL基础45:光照矫正(下)之Gamma校正

    接上文:OpenGL基础44:光照矫正(上) 四.Gamma矫正 4.1.人的视觉特性 和很多错视图一样,对于下面这张灰阶图,如果1表示纯白,0表示纯黑,那么这张图片的哪个位置代表的是0.5,也就是自 ...

  2. Win32 OpenGL编程(4) 2D图形基础(颜色及坐标体系进阶知识)

    Win32 OpenGL 编程 (4) 2D 图形基础(颜色及坐标体系进阶知识) write by 九天雁翎 (JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 ...

  3. opengl基础学习

    转自:http://www.cnblogs.com/crazyxiaom/articles/2073586.html 说起编程作图,大概还有很多人想起TC的#include <graphics. ...

  4. opengl基础学习专题 (二) 点直线和多边形

    题外话 随着学习的增长,越来越觉得自己很水.关于上一篇博文中推荐用一个 学习opengl的 基于VS2015的 simplec框架.存在 一些问题. 1.这个框架基于VS 的Debug 模式下,没有考 ...

  5. [转]OpenGL基础技术讲座--发展历史

    OpenGL基础技术讲座--发展历史 第一讲 OpenGL 的发展历史 人们对三维图形技术的研究已经经历了一个很长的历程,而且涌现了许多三维图形开发工具,其中SGI公司推出的GL(Graphics L ...

  6. OpenGL基础54:点光源阴影

    前置: OpenGL基础53:阴影映射(下) 一.万象阴影贴图 之前成功实现了平行光阴影,生成阴影贴图时使用的矩阵是正交矩阵,若是想要实现点光源的阴影效果,那么理论上只需要修改投影矩阵为透视矩阵就好了 ...

  7. OpenGL基础53:阴影映射(下)

    接上文:OpenGL基础52:阴影映射(上) 五.阴影失真 按照上文的计算的结果,一个很明显的问题是:对于参与计算深度贴图的物体,其表面可以看到这样的栅格状的阴影,这种常见的错误表现也叫做阴影失真(S ...

  8. OpenGL基础50:HDR

    一.HDR与LDR 由于显示器只能显示值为0.0到1.0间的颜色,因此当数据存储在帧缓冲(Framebuffer)中时,亮度和颜色的值也是默认被限制在0.0到1.0之间的,这个颜色范围即是LDR(Lo ...

  9. OpenGL基础46:切线空间

    到这里,关于OpenGL基础的了解要接近尾声了,上一个节点是<OpenGL基础25:多光源>.在此章之后,学习openGL的各种教程的同时,可以转战想要了解的渲染引擎,也可以去github ...

最新文章

  1. SAP SD基础知识之订单中装运相关的功能 II
  2. 对于STM32F103三轴机械臂控制器进行基本功能测试-关节角度读取
  3. HashSet源码分析
  4. 多重继承java_Java中的多重继承与组合vs继承
  5. [js] 代码中如果遇到未定义的变量,会抛出异常吗?程序还会不会继续往下走?
  6. 如何修改Vue和springboot的默认端口号
  7. vue中配置不同的代理同时访问不同的后台
  8. tempdb页面分配争用问题
  9. MS SQL SERVER中的临时表
  10. 从3dmax导出动画总结
  11. Veritas Backup Exec 21.3 Multilingual (Windows)
  12. 财务分析就是财务报表分析吗?
  13. ┊非主流图片┊非主流美女┊非主流照片
  14. 甲醇合成技术的研究进展
  15. Stream流-分组操作
  16. 中国娱记的鼻祖留心shuo新浪博客
  17. 趣店能否撑起百亿美元市值!
  18. 除了Micrsoft Office和WPS,有没有免费好用的office软件?
  19. php制作日历带节日实验目的,php制作日历
  20. Python:loc和iloc的区别

热门文章

  1. python画曲线图-Python数据可视化之Matplotlib(折线图)
  2. 化学人学python有前途吗-转载:python之蟒开启理论计算化学的新时代
  3. python编程是干嘛的-Python这么火到底能干啥?
  4. python怎么读取中文文件-Python3 解决读取中文文件txt编码的问题
  5. 三星S8折戟语音识别,靠拿来主义和自主研发仍难有起色
  6. 苹果测试集了成语音识别和人脸识别的智能家居?
  7. Vue-动态组件和插槽
  8. 一些实用博客的分享(ES6详解,echart属性详解)
  9. 【动态规划】P4170 :涂色(区间dp)
  10. 从硬件竞争到软实力PK——电视媒体竞争观察