OpenGL学习笔记——颜色

每个像素的颜色信息存储方式:

  • RGBA模式:有些图形硬件可以使用抖动来增加可以显示的颜色数量(抖动在默认情况下是开启的)。
  • 颜色索引:可用颜色数量受限于颜色映射表的大小以及可用的位平面的数量。

在程序执行早期,设置颜色显示模式,当颜色显示模式初始化之后就无法进行更改了,在程序执行期间根据顶点颜色确定每个几何图元的颜色。如果启用了光照,它的颜色取决于变换矩阵与表面法线以及其他材料属性的交互效果。在执行光照计算后,程序所选择的着色模式(单调着色或平滑着色)随之生效。接着图元被光栅化(转换为二维图像),光栅化决定了图元将占据窗口坐标中得哪些整型栅格方块,并为每个方格分配颜色和其他值。一个具有颜色、深度和纹理坐标的栅格方块称为片断。像素是帧缓冲区的基本元素。片断来自于图元,它与对应的像素组合,形成一个新的像素。在创建了片断之后,OpenGL会对片断应用纹理、雾和抗锯齿处理。之后,OpenGL使用片断以及已经存储在帧缓冲区中的像素,执行所有指定的alpha混合、抖动和位逻辑操作。最后,片断的颜色(RGBA值或颜色索引值)写入到像素,根据窗口的颜色显示模式在窗口中显示。

无论是RGBA还是颜色索引模式,每个像素都存储了一定数量的颜色数据,这个数量是由帧缓冲区的位平面数量决定的。在每个像素中,1个位平面表示1位数据。

颜色索引模式可以实现一些特殊的技巧,例如颜色映射动画和层次绘图,一般而言,应尽可能使用RGBA模式,RGBA模式可以在纹理贴图中使用,并且在使用光照、着色、雾和抗锯齿功能时更加灵活。

把颜色值转为浮点值:

后缀 数据类型 最小值 最小值映射到 最大值 最大值映射到
b 1字节整数 -128 -1.0 127 1.0
s 2字节整数 -32768 -1.0 32767 1.0
i 4字节整数 -2147483648 -1.0 2147483648 1.0
ub 1字节无符号整数 0 0.0 255 1.0
us 2字节无符号整数 0 0.0 65535 1.0
ui 4字节无符号整数 0 0.0 4294967295 1.0

直线或填充多边形可以用一种颜色进行绘制(单调着色),也可以用多种颜色进行绘制(平滑着色)。可以用glShadeModel()函数指定所需的着色模型。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 21:18:21

OpenGL学习笔记——颜色的相关文章

【OpenGL 学习笔记02】宽点画线

我们要知道,有三种绘图操作是最基本的:清除窗口,绘制几何图形,绘制光栅化对象. 光栅化对象后面再解释. 1.清除窗口 比如我们可以同时清除颜色缓冲区和深度缓冲区 glClearColor (0.0, 0.0, 0.0, 0.0);//指定颜色缓冲区清除为黑色 glClearDepth(1.0);//指定深度缓冲区的清除值为1.0 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//指定要清除的缓冲区并清除 2.绘制几何图形 先要设置绘制颜色,

【opengl 学习笔记01】HelloWorld示例

<<OpenGL Programming Guide>>这本书是看了忘,忘了又看,赶脚还是把笔记做一做心里比较踏实,哈哈. 我的主题是,好记性不如烂笔头. ================================================================ 1. 下载glut库 glut库地址为:www.opengl.org/resources/libraries/glut/glutdlls37beta.zip glut全称为:OpenGL Utilit

OpenGL学习笔记3 —— 绘制3D物体、鼠标交互、反向变换

/* reference http://nehe.gamedev.net/article/using_gluunproject/16013/ */ #include <windows.h> // windows系统要加这个.因为下面2个头文件的一些宏是在这个文件中定义的 #include <gl/Gl.h> #include <gl/glut.h> //这两个头文件在OpenGL程序中几乎必加. #include <cstdio> //标准输入输出,用来打印

【OpenGL 学习笔记04】顶点数组

通过之前的学习,我们知道,如果要绘制一个几何图形,那就要不断的调用绘制函数,比如绘制一个20条边的多边形,起码要调用22条函数(包含glBegin和glEnd). 所以OpenGL提供了一系列的顶点数组函数减少函数调用的次数来提高性能.而且使用顶点还可以避免顶点共享的冗余处理. 1.简单示例 先来回顾一下之前我们是怎么画直线的: void drawOneLine(GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2) { glBegin(GL_LINES); g

【OpenGL 学习笔记03】点画多边形

1.点画多边形 //定义填充多边形的点画模式.mask为32 x 32 的位图指针,1画0不画,使用前必须启用多边形点画功能 void glPloygonStipple(const GLubyte* mask); //绘制一个矩形 void glRectf(GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2); 2.示例 #include <GL/glut.h> #include <stdlib.h> void display(void) { G

OpenGL学习笔记1 —— 画点

#include <windows.h> // windows系统要加这个.因为下面2个头文件的一些宏是在这个文件中定义的 #include <gl/Gl.h> #include <gl/glut.h> //这两个头文件在OpenGL程序中几乎必加. //<<<<<<<<<<<<<<<<<<<<<<< myInit >>&

OpenGL学习笔记2 —— 画立方体

#include <windows.h> // windows系统要加这个.因为下面2个头文件的一些宏是在这个文件中定义的 #include <gl/Gl.h> #include <gl/glut.h> //这两个头文件在OpenGL程序中几乎必加. //<<<<<<<<<<<<<<<<<<<<<<< myInit >>&

OpenGL学习笔记:拾取与选择

转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当前鼠标的位置是哪一个物体呢? OpenGL有一套机制,叫做Picking, 里面涉及到几个核心概念: 1. selection mode. 选择模式 2. name stack. 名字栈 3. hit record. 命中记录 4. viewing volume. 视角范围 在OpenGL的pick

OpenGL学习笔记4:纹理

原始图像数据 像素包装 图像数据在内存中很少以紧密包装的形式存在.在许多硬件平台上,处于性能上的考虑,一幅图像的每一行都应该从一种特定字节对齐地址开始.绝大多数编译器会自动把变量和缓冲区放置在一个针对该架构对齐优化的地址上. 例如一个包含3个分量的rgb图像,每个分量存储在一个字节中,如果图像有199个像素,那么一行需要597个像素.如果硬件本身的体系结构是4字节排列,那么图像每一行的末尾将由额外的3个空字符进行填充达到600字节. 我们可以使用下列函数改变或者回复像素的存储方式. void g