glPolygonStipple参数的二进制转换

时间:2013-12-05 05:08:08

标签: opengl

我正在尝试从http://www.glprogramming.com/red/chapter02.html学习语言。在该网站上有一个关于如何使用glPolygonStipple的示例。我的理解是GLubyte数组中的十六进制数字被保存以转换为二进制数,因此它可以生成位图。我只是想知道这些数组中的元素究竟是如何形成这些模式的。

以下是网站上的例子:

#include <Windows.h>
#include <GL/gl.h>
#include <GL/glut.h>
void display(void)
 {
GLubyte fly[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x03, 0x80, 0x01, 0xC0, 0x06, 0xC0, 0x03, 0x60, 
  0x04, 0x60, 0x06, 0x20, 0x04, 0x30, 0x0C, 0x20, 
  0x04, 0x18, 0x18, 0x20, 0x04, 0x0C, 0x30, 0x20,
  0x04, 0x06, 0x60, 0x20, 0x44, 0x03, 0xC0, 0x22, 
  0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 
  0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22,
  0x44, 0x01, 0x80, 0x22, 0x44, 0x01, 0x80, 0x22, 
  0x66, 0x01, 0x80, 0x66, 0x33, 0x01, 0x80, 0xCC, 
  0x19, 0x81, 0x81, 0x98, 0x0C, 0xC1, 0x83, 0x30,
  0x07, 0xe1, 0x87, 0xe0, 0x03, 0x3f, 0xfc, 0xc0, 
  0x03, 0x31, 0x8c, 0xc0, 0x03, 0x33, 0xcc, 0xc0, 
  0x06, 0x64, 0x26, 0x60, 0x0c, 0xcc, 0x33, 0x30,
  0x18, 0xcc, 0x33, 0x18, 0x10, 0xc4, 0x23, 0x08, 
  0x10, 0x63, 0xC6, 0x08, 0x10, 0x30, 0x0c, 0x08, 
  0x10, 0x18, 0x18, 0x08, 0x10, 0x00, 0x00, 0x08};
GLubyte halftone[] = {
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
  0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55};

glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);

/*  draw one solid, unstippled rectangle,       */      
/*  then two stippled rectangles                */
glRectf (25.0, 25.0, 125.0, 125.0);
glEnable (GL_POLYGON_STIPPLE);
glPolygonStipple (fly);
glRectf (125.0, 25.0, 225.0, 125.0);
glPolygonStipple (halftone);
glRectf (225.0, 25.0, 325.0, 125.0);
glDisable (GL_POLYGON_STIPPLE);

glFlush ();
}

void init (void) 
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);    
}

void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h);
}

int main(int argc, char** argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
  glutInitWindowSize (350, 150);
  glutCreateWindow (argv[0]);
  init ();
  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  glutMainLoop();
  return 0;  
}

1 个答案:

答案 0 :(得分:3)

Binary是一个基数为2的数字系统,这意味着每个数字都是0或1.这非常适合点画模式,因为0表示“不绘制这个像素”,1表示“绘制”这个像素“。在多边形上使用的点画图案是2维的,所以你有几行这些0和1,构建一个像素模式。

具体来说,每行有32行32位二进制数字(位)。

不幸的是,您无法在C和C ++等语言的源代码中输入二进制数。通常使用十六进制代替。它是一个基数为16的数字系统,因此每个数字可以是0-9或A-F(字母A-F代表十进制值10-15)。

关于它的好处是每个数字整齐地对应于4个二进制数字(或位)的模式。这使得转换变得非常容易。以下是它们的对应方式:

Hex  Binary
0    0000
1    0001
2    0010
3    0011
4    0100
5    0101
6    0110
7    0111
8    1000
9    1001
A    1010
B    1011
C    1100
D    1101
E    1110
F    1111

(如果您不熟悉数字在二进制中的表示方式,那么这可能看起来很奇怪。如果您想了解更多有关详细信息,可以在线提供大量的教程和解释。)

当您看到十六进制数字(如0x31)时,您可以先忽略“0x”前缀 - 这只表示该数字为十六进制。要找出二进制等价物,只需在表中查找其他数字,一次一个,以获得二进制等效值。在这种情况下,它是3后跟1,这意味着二进制模式是0011 0001(没有空格)。

在点画模式中,这意味着它将留下2个像素空白,绘制2个像素,留下3个像素空白,最后绘制1个像素。

在您发布的示例代码中,您可以看到几对十六进制数字。每个十六进制对为您提供8个二进制位(或1个字节)。这意味着4对连续的十六进制数字是32位,这是点画模式的一个完整行。总共有32行。

值得注意的是,示例代码的格式有点混乱。它每行源代码显示8个十六进制对。 OpenGL并不关心这一点。它只是看到一个连续的数字数组,它每行分成32位。