openGL指定着色模式

#include <math.h>
const GLdouble Pi = 3.1415926536;
void myDisplay(void)
{
int i;
// glShadeM odel(GL_FLAT);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLE_FAN);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex2f(0.0f, 0.0f);
for(i=0; i<=8; ++i)
{
glColor3f(i&0x04, i&0x02, i&0x01);glVertex2f(cos(i*Pi/4), sin(i*Pi/4));
}
glEnd();
glFlush();
}

在默认情况下,OpenGL 会计算两点顶点之间的其它点,并为它们填上“合适”的颜色,使相邻的点的颜色值
都比较接近。如果使用的是 RGB 模式,看起来就具有渐变的效果。如果是使用颜色索引模式,则其相邻点
的索引值是接近的,如果将颜色表中接近的项设置成接近的颜色,则看起来也是渐变的效果。但如果颜色
表中接近的项颜色却差距很大,则看起来可能是很奇怪的效果。
使用 glShadeM odel 函数可以关闭这种计算,如果顶点的颜色不同,则将顶点之间的其它点全部设置为与某
一个点相同。(直线以后指定的点的颜色为准,而多边形将以任意顶点的颜色为准,由实现决定。)为了避
免这个不确定性,尽量在多边形中使用同一种颜色。
glShadeM odel 的使用方法:
glShadeM odel(GL_SM OOTH); // 平滑方式,这也是默认方式
glShadeM odel(GL_FLAT);
// 单色方式
小结:
本课学习了如何设置颜色。其中 RGB 颜色方式是目前 PC 机上的常用方式。
可以设置 glClear 清除后屏幕所剩的颜色。

可以设置颜色填充方式:平滑方式或单色方式。

一、当glShadeModel(GL_SMOOTH)


二、当glShadeModel(GL_FLAT)时


### 实现线型着色OpenGL核心模式下绘制线条并为其应用颜色效果涉及多个方面。由于OpenGL是一个低级别的API,这意味着它不支持直接绘制复杂的几何形状;程序员需利用基本的几何图元组合成复杂图形[^1]。 对于线型着色,在设置好管线之后,可以定义顶点属性来指定每条线上不同位置的颜色值。下面展示了一个简单的例子,说明如何创建一条带有渐变色彩的直线: #### 设置顶点数据与颜色信息 首先准备顶点坐标及其对应的颜色作为输入给GPU的数据集。这里采用两个三维向量表示端点的位置以及RGBA四维数组代表各端点处的颜色强度。 ```cpp float vertices[] = { // Positions // Colors -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }; ``` 接着分配一个顶点缓冲对象(VBO),用于存储上述顶点数据,并通过`glBindBuffer()`绑定该VBO到目标GL_ARRAY_BUFFER上以便后续操作。使用`glBufferData()`一次性上传整个顶点列表至显存中供渲染器访问。 ```cpp unsigned int VBO; glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); ``` #### 编写着色程序 为了使线条呈现出预期的效果,还需要编写相应的着色器代码。这通常包括至少一对顶点着色器和片段着色器。以下是简化版的着色器源码示例: **顶点着色器** ```glsl #version 330 core layout(location = 0) in vec3 position; layout(location = 1) in vec4 color; out VS_OUT { vec4 color; } vs_out; void main() { gl_Position = vec4(position, 1.0); vs_out.color = color; } ``` **片段着色器** ```glsl #version 330 core in VS_OUT { vec4 color; } fs_in; out vec4 FragColor; void main(){ FragColor = fs_in.color; } ``` 完成以上步骤后,即可调用`glDrawArrays()`函数执行实际绘图命令,从而显示具有特定样式的线条。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值