opengl的点画模式

OPENGL | 2010-02-11 13:24:29 | 阅读 652 次 | 评论(0)
书上说使用这个函数: glPolygonMode(const GLubype *mask);
先在外面定义一个数组(数组元素值的2进制码,1和0 表示一个位的填充和非填充)
书上就说是 32*32 位图的数组
我整来整去理解了N久,不绕了,把我知道的写下来:
先在开头用指定的类型定义数组 GLubype arr[128];
数组的每个元素占8个位,也就是一个字节,整型。
(32*32点阵=1024个点,每个元素占8个位,于是可以分配128个元素)
环境,整个窗口坐标为左下角 (0,0) 右上角 (500,500)
这个时候先假设画的是 左下角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行。
4个字节为1行(4*8=32), 定义第一行:
arr[0]=0;
arr[1]=0;
arr[2]=0;
arr[3]=1;
(我老以为第一行在矩形上面第一行,这不是打稿纸,这是x,y轴,最开始行在下方)
用0和1表示,空格做区分。那么最下端的那条线将显示为:
00000000 00000000 00000000 00000001
但是我定义的矩阵长有100个位,程序对这一行的32位循环向右填充
00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000001 ……
所以你会看到这一行大约出现3个点。
只定义了第一行有点,为什么出现多个这样的行呢?
前面说了点阵定义的是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 500
int 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

文章评论,共0条
游客请输入验证码
文章分类
文章归档
阅读排行
最新评论