QT-讷河 代码重写

上一课中我教给您三角形和四边形的绘制方法。这一课我将教您给三角形和四边形添加两种不同类型的着色方法。使用单调着色(Flat coloring)给四边形涂上固定的一种颜色。使用平滑着色(Smooth coloring)将三角形的三个顶点的不同颜色混合在一起,创建漂亮的色彩混合。

我们只要修改第二课中的NeHeWidget类中的paintGL()函数就可以了。

NeHeWidget类

(由nehewidget.cpp展开。)

void NeHeWidget::paintGL()
{
  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  glLoadIdentity();
  
  glTranslatef( -1.5,  0.0, -6.0 );
  
  glBegin( GL_TRIANGLES );
    glColor3f( 1.0, 0.0, 0.0 );

红色。

如果您还记得上节课的内容,这段代码在屏幕的左半部分绘制三角形。这一行代码是我们第一次使用命令glColor3f( r, g, b )。括号中的三个参数依次是红、绿、蓝三色分量。取值范围可以从0.0到1.0。类似于以前所讲的清除屏幕背景命令。

我们将颜色设为红色(纯红色,无绿色,无蓝色)。

    glVertex3f(  0.0,  1.0,  0.0 );

上顶点。

接下来的一行代码设置三角形的第一个顶点(三角形的上顶点),并使用当前颜色(红色)来绘制。从现在开始所有的绘制的对象的颜色都是红色,直到我们将红色改变成别的什么颜色。

    glColor3f( 0.0, 1.0, 0.0 );

绿色。

    glVertex3f( -1.0, -1.0,  0.0 );

左下顶点。

    glColor3f( 0.0, 0.0, 1.0 );

蓝色。

    glVertex3f(  1.0, -1.0,  0.0 );

右下顶点。

  glEnd();

glEnd()出现后,三角形将被填充。但是因为每个顶点有不同的颜色,因此看起来颜色从每个角喷出,并刚好在三角形的中心汇合,三种颜色相互混合。这就是平滑着色。

  glTranslatef(  3.0,  0.0,  0.0 );
  
  glColor3f( 0.5, 0.5, 1.0 );

一次性将颜色设置为蓝色。

现在我们绘制一个单调着色——蓝色的正方形。最重要的是要记住,设置当前色之后绘制的所有东东都是当前色的。以后您所创建的每个工程都要使用颜色。即便是在完全采用纹理贴图的时候,glColor3f仍旧可以用来调节纹理的色调。等等...,以后再说吧。

我们必须要做的事只需将颜色一次性的设为我们想采用的颜色(本例采用蓝色),然后绘制场景。每个顶点都是蓝色的,因为我们没有告诉OpenGL要改变顶点的颜色。最后的结果是.....全蓝色的正方形。再说一遍,顺时针绘制的正方形意味着我们所看见的是四边形的背面。

  glBegin( GL_QUADS );
    glVertex3f( -1.0,  1.0,  0.0 );
    glVertex3f(  1.0,  1.0,  0.0 );
    glVertex3f(  1.0, -1.0,  0.0 );
    glVertex3f( -1.0, -1.0,  0.0 );
  glEnd();
}

在这一课中,我试着尽量详细的解释如何为您的OpenGL多边形添加单调和平滑的着色效果的步骤。改改代码中的红绿蓝分量值,看看最后有什么样的结果。

本课程的源代码

时间: 2024-08-29 10:34:47

QT-讷河 代码重写的相关文章

HectorSLAM论文解析?代码重写(2)

这篇文章为HectorSLAM系列的以下部分 HectorSLAM的整体逻辑 激光匹配 地图构造 地图更新 500行代码重写一个LidarSLAM 测试数据的准备,和测试数据读取模块的编写 GUI编写 地图模块的编写 核心模块的编写 主循环 匹配算法 首先绘制一张以扫描匹配为核心的SLAM(例如Hector,Karto_slam,Cartographer..)大概的流程图: 基本上以这一类SLAM流程分以下几个部分: motion prediction(运动预测) scan matching(扫

Node.js的Connect框架的代码重写与改进

Node.js的Connect框架的代码重写与改进 Connect框架简介 Connect框架是建立在Node.js的基本http.server功能之上,帮助实现结构化的web服务器逻辑的框架.Connect框架建立在两个重要的设计模式之上. 1) 责任链模式 在处理web请求时常需要作分派处理.例如,ASP.NET MVC支持按照请求参数将处理分派至某个Controller类的某个Action方法,以及根据Action方法的返回结果类型分派不同的结果操作(如ViewResult.JsonRes

HectorSLAM论文解析?代码重写(3)

这篇文章为HectorSLAM系列的以下部分 HectorSLAM的整体逻辑 激光匹配 地图构造 地图更新 500行代码重写一个LidarSLAM 测试数据的准备,和测试数据读取模块的编写 GUI编写 地图模块的编写 核心模块的编写 主循环 匹配算法 本文中的代码和数据放在:https://github.com/scomup/lslam 在[HectorSLAM论文解析?代码重写(2)]中,我们已经理清楚理论,从这一篇文章开始,我们就用python,手把手把上面的内容用代码实现. 当然在代码之前

Qt:走马灯代码理解

走马灯是编程学习中常用到的示例代码.在这里把从中学到的知识进行一个汇总.如有不对之处,请各位指正. 一:思路 走马灯首先要考虑是在特定时间点将显示内容向一个方向移动,当显示最后有空位时,循环填写显示内容. 要有一个定时器:处理定时器的事件:显示的文本内容:当显示内容在控件中移动时,需要重绘控件. 当控件隐藏后,停止走马灯. 处理控件隐藏事件. 当控件显示时,开始走马灯. 处理控件显示事件. 二:头文件 #ifndef MAINWIDGET_H#define MAINWIDGET_H #inclu

花丛效果文字代码重写

其实是一个1k代码比赛看到的作品,当时觉得效果太炫酷了,一直想把它重写成一个类方便调用,一直拖,今天拿出来搞搞完.效果图: 其实这是个渐变动画的过程,color的rgba值和定时器结束的设置尤为重要,而且各种浏览器的渲染速度也不尽相同,过了头很可能就这样了...

Qt的paint函数重写,以及QPaint给一条线绘制箭头

直接代码: QPainter *painter; static const double Pi = 3.14159265358979323846264338327950288419717; static double TwoPi = 2.0 * Pi; QLineF line(sourcePoint,destPoint); if (qFuzzyCompare(line.length(), qreal(0.))) return; painter->setPen(QPen(Qt::black, 1,

QT之计算器代码重构

首先我们来讲讲为什么要进行代码重构?在一些大的项目中,代码重构是一个必不可少的步骤.因为项目大了,代码也就多了,后期的维护将会很难,所以我们要适当的进行代码重构,让代码的可复用性提高,使软件的设计和架构更加合理. 代码实现和代码重构有什么不同呢?代码实现的重点是功能的实现,而代码重构则是在实现功能的基础上进行再次优化,以提高代码质量. 那么什么样的代码需要重构呢?依据以往的项目开发经验来看呢,当发现项目中的重复代码越来越多时.代码功能越来越不清晰时.代码离设计越来越远时等,那么这时我们就该进行代

[python] 词云:wordcloud包的安装、使用、原理(源码分析)、中文词云生成、代码重写

词云,又称文字云.标签云,是对文本数据中出现频率较高的“关键词”在视觉上的突出呈现,形成关键词的渲染形成类似云一样的彩色图片,从而一眼就可以领略文本数据的主要表达意思.常见于博客.微博.文章分析等. 除了网上现成的Wordle.Tagxedo.Tagul.Tagcrowd等词云制作工具,在python中也可以用wordcloud包比较轻松地实现(官网.github项目): from wordcloud import WordCloud import matplotlib.pyplot as pl

离线版-端点检测代码重写

根据对双门限的理解和修改,重写了一个离线版端点检测. function [st,en]=VAD(x, fs) x=double(x); x=x/max(abs(x)); framelen= floor(fs*40/1000);% frameinc= floor(fs*10/1000);% y=enframe(x,framelen,frameinc); %计算短时间能量 amp=sum(abs(y),2); %开始端点检测 tmp1=enframe(x(1:length(x)-1),framele