作者在 2010-02-11 13:24:29 发布以下内容
书上说使用这个函数: glPolygonMode(const GLubype *mask);
先在外面定义一个数组(数组元素值的2进制码,1和0 表示一个位的填充和非填充)
书上就说是 32*32 位图的数组
我整来整去理解了N久,不绕了,把我知道的写下来:
书上就说是 32*32 位图的数组
我整来整去理解了N久,不绕了,把我知道的写下来:
先在开头用指定的类型定义数组 GLubype arr[128];
数组的每个元素占8个位,也就是一个字节,整型。
(32*32点阵=1024个点,每个元素占8个位,于是可以分配128个元素)
数组的每个元素占8个位,也就是一个字节,整型。
(32*32点阵=1024个点,每个元素占8个位,于是可以分配128个元素)
环境,整个窗口坐标为左下角 (0,0) 右上角 (500,500)
这个时候先假设画的是 左下角0,0 右上角100,100的正方形
这个时候先假设画的是 左下角0,0 右上角100,100的正方形
首先开启点画模式
glEnable(GL_POLYGON_STIPPLE);
然后定义 arr[128]中的每个元素。
定义好就调用函数:
glPolygonStipple(arr);
开始画多边形:
glBegin(GL_POLYGON);
glVertex3f(0.0,0.0,0.0);
glVertex3f(0.0,100.0,0.0);
glVertex3f(100.0,100.0,0.0);
glVertex3f(100.0,0.0,0.0);
glEnd();
==================================
数组与点分布状况 之间的关系:
所定义的矩阵如书中所说,是32*32的
所以对应一行有32位,共32行。
然后定义 arr[128]中的每个元素。
定义好就调用函数:
glPolygonStipple(arr);
开始画多边形:
glBegin(GL_POLYGON);
glVertex3f(0.0,0.0,0.0);
glVertex3f(0.0,100.0,0.0);
glVertex3f(100.0,100.0,0.0);
glVertex3f(100.0,0.0,0.0);
glEnd();
==================================
数组与点分布状况 之间的关系:
所定义的矩阵如书中所说,是32*32的
所以对应一行有32位,共32行。
4个字节为1行(4*8=32), 定义第一行:
arr[0]=0;
arr[1]=0;
arr[2]=0;
arr[3]=1;
arr[0]=0;
arr[1]=0;
arr[2]=0;
arr[3]=1;
(我老以为第一行在矩形上面第一行,这不是打稿纸,这是x,y轴,最开始行在下方)
用0和1表示,空格做区分。那么最下端的那条线将显示为:
00000000 00000000 00000000 00000001
用0和1表示,空格做区分。那么最下端的那条线将显示为:
00000000 00000000 00000000 00000001
但是我定义的矩阵长有100个位,程序对这一行的32位循环向右填充
00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000001 ……
00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000001 ……
所以你会看到这一行大约出现3个点。
只定义了第一行有点,为什么出现多个这样的行呢?
前面说了点阵定义的是32*32的矩阵,
当要填充的矩阵大于32*32的时候,
横向的不够填,用该行位图循环向右填;
纵向的不够填,用整个 32行 向上填充; 直到满格为止
前面说了点阵定义的是32*32的矩阵,
当要填充的矩阵大于32*32的时候,
横向的不够填,用该行位图循环向右填;
纵向的不够填,用整个 32行 向上填充; 直到满格为止
附上我测试时的代码,编译环境,windowsXP下DevC++4.9.9.2,安装了glut.3.7.6+.DevPak
===========================
#include <GL/glut.h>
#include <stdlib.h>#define xpix 500int winid;
void display(void)
{
int i,j;
GLubyte arr[128];
for (i=0;i<128;i++) {arr[i]=0;} //为了测试某点,先定义成全部为空;
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_POLYGON_STIPPLE); //开启点画功能
arr[3]=1; //下方第一行往右第8*4=32位,描点,以32位的方式循环铺垫
glPolygonStipple(arr); //调用
glBegin(GL_POLYGON);
glVertex3f(0.0,0.0,0.0);
glVertex3f(100.0,0.0,0.0);
glVertex3f(100.0,100.0,0.0);
glVertex3f(0.0,100.0,0.0);
glEnd();
glFlush();
_sleep(200);
}void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glOrtho(0.0,xpix,0.0,xpix,0.0,1.0);
}void hitkey(unsigned char key,int mousex,int mousey)
{
if (key=='q')
{
glutDestroyWindow(winid);
exit(0);
}
}int main(int argc,char *argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);
glutInitWindowSize(xpix,xpix);
glutInitWindowPosition(0,0);
winid=glutCreateWindow("a");
init();
glutDisplayFunc(display);
glutKeyboardFunc(hitkey);
glutMainLoop();
return 0;
}
=========================
有些比较会用到的数字比如 10101010(2),隔一个位描一个点,10进制为170
书上通过
10101010 (170)以及
01010101 (85)这样的两行交错的方式实现模糊网格。
写了一个批处理,用来换2进制到10进制的,方便操作
@echo off
setlocal enabledelayedexpansion
:main
set "inp="
set zero=0000000000000000
set /p inp="输入一个2进制码,16位以内:"
if "%inp%"=="exit" (exit)
set inp=%zero%%inp%
set inp=%inp:~-16%
set /a rs=0
for /l %%a in (15,-1,0) do (
set /a move=15-%%a,size = !inp:~%%a,1! "<<" move,rs=rs+size
)
echo %rs%
echo,
goto :main