回 帖 发 新 帖 刷新版面

主题:[原创]OpenGL入门学习——第四课

现在放出第四课的内容。
先回顾一下我们都学习了些什么:

[url=http://www.programfan.com/club/showbbs.asp?id=184355]第一课,编写第一个OpenGL程序[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=184525]第二课,绘制几何图形[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=184769]第三课,绘制几何图形的一些细节问题[/url]
第四课,颜色的选择  ——→  [color=0000FF]本次课程的内容[/color]

本次学习的是颜色的选择。终于要走出黑白的世界了~~


=====================未完,请勿跟帖=====================

回复列表 (共27个回复)

21 楼

在这个程序中
#include <math.h>
const GLdouble Pi = 3.1415926536;
void myDisplay(void)
{
    int i;
    // glShadeModel(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();
}

有一个FOR循环,在执行中是怎样体现颜色渐进的呢?对glColor3f(i&0x04, i&0x02, i&0x01);中的参数我有点不理解,请朋友指点,先谢过了。

22 楼

通常情况下,你不必对每个像素单独指定颜色。

OpenGL把几何图形归纳为“顶点”。一个顶点可以有许多信息,包括它的坐标、颜色等。多个顶点可定义一个多边形,对于顶点之间的点,其颜色或其它各种数据都是通过周围的顶点的数据以及它们之间的距离共同决定的。

例如我画一条线段,一头为红色,一头为蓝色,则线段上的点大致是既有一些红色成分,也有一些蓝色成分。越接近红色的一端,红色的成分就越多;越接近蓝色的一端,蓝色的成分就越多。每个点都如此计算,从宏观上看就具有了渐变的效果。

不仅是颜色,其它数据例如:法线向量、材质等,都是通过这样的手段处理的。

23 楼

每行代码前面的空格好像是全角的  或者是大写的空格  
编译器不识别  将前面的空格都删掉就OK

24 楼

先顶一下
另外看参数,括号里不应该是浮点数吗,怎么?

glColor3f(i&0x04, i&0x02, i&0x01);

25 楼

for(i=0; i<=8; ++i)
    {
        glColor3f(i&0x04, i&0x02, i&0x01);
        glVertex2f(cos(i*Pi/4), sin(i*Pi/4));
    }

首先i是int类型的数据,所以可以执行&运算,得到的结果也是int类型。然后glColor3f这个函数的三个参数都是GLfloat类型的,编译器会自动进行类型转化。
glColor3f(i&0x04, i&0x02, i&0x01);
相当于
glColor3f( (GLfloat)(i&0x04), (GLfloat)(i&0x02), (GLfloat)(i&0x01) );

26 楼


 楼主这样采用位运算的方法给出RGB的颜色,理论上是可以的。
但是在第四课中楼主的曾说:

glColor系列函数,在参数类型不同时,表示“最大”颜色的值也不同。
采用f和d做后缀的函数,以1.0表示最大的使用。

这样采用位运算算出的值不是超出了1.0这个法定的最大值?请楼主帮忙解释。
谢谢。

27 楼

是的。
这样计算的结果的确是超过了1.0这个“最大值”。
严格的说,glColor3f(i&0x04, i&0x02, i&0x01);这样的写法并不好。不过即使是超过了最大值,OpenGL的实现者也往往会按照最“合理”的方式来处理它。对于颜色来说,超过时最合理的处理就是“截断”了,即超过1.0的值都算作1.0。

我来回复

您尚未登录,请登录后再回复。点此登录或注册