⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 处理流水线1.cpp

📁 经典 C++代码
💻 CPP
字号:
#include<windows.h>
#include<stdio.h>
#include<String.h>
#include<stdlib.h>
#include<GL\glaux.h>

#pragma comment(lib,"opengl32")
#pragma comment(lib,"glu32")
#pragma comment(lib,"glaux")

#define PIXEL_CENTER(x)((long)(x)+0.5)

#define GAP              10
#define ROWS             3
#define COLS             4

#define OPENGL_WIDTH     48
#define OPENGL_HEIGHT    13

static void Init(void);
static void CALLBACK Resize(int width,int height);
static void RotateColorMask(void);
static void CALLBACK KeyPress1(void);
static void CALLBACK KeyPress2(void);
static void CALLBACK KeyPress3(void);
static void Viewport(GLint row,GLint column);
static void Point(void);
static void Lines(void);
static void LineStrip(void);
static void LineLoop(void);
static void Bitmap(void);
static void Triangles(void);
static void TriangleStrip(void);
static void TriangleFan(void);
static void Rect(void);
static void xPolygon(void);
static void Quads(void);
static void QuadStrip(void);
static void CALLBACK Paint(void);
static GLenum Args(int argc,char **argv);

GLenum rgb,doubleBuffer,windType;
GLint windW,windH;

GLenum mode1,mode2;
GLint boxW,boxH;
GLubyte OpenGL_bits[]={
	0x00,0x03,0x00,0x00,0x00,0x00,
	0x7f,0xfb,0xff,0xff,0xff,0x01,
	0x7f,0xfb,0xff,0xff,0xff,0x01,
	0x00,0x03,0x00,0x00,0x00,0x00,
	0x3e,0x8f,0xb7,0xf9,0xfc,0x01,
	0x63,0xdb,0xb0,0x8b,0x0d,0x00,
	0x63,0xdb,0xb7,0x8b,0x0d,0x00,
	0x63,0xdb,0xb6,0x8b,0x0d,0x00,
	0x63,0x8f,0xf3,0xcc,0x0d,0x00,
	0x63,0x00,0x00,0x0c,0x4c,0x0a,
	0x63,0x00,0x00,0x0c,0x4c,0x0e,
	0x63,0x00,0x00,0x8c,0xed,0x0e,
	0x3e,0x00,0x00,0xf8,0x0c,0x00,
};

/////////////////////////////////////////////////////////////////////

static void Init(void)
{
	mode1=GL_TRUE;
	mode2=GL_TRUE;
}

/////////////////////////////////////////////////////////////////////

static void CALLBACK Resize(int width,int height)
{
	windW=(GLint)width;
	windH=(GLint)height;
}

/////////////////////////////////////////////////////////////////////

static void RotateColorMask(void)
{
	static GLint rotation=0;

	rotation=(rotation+1)&0x3;

	switch(rotation)
	{
	case 0:
		glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
		glIndexMask(0xff);
		break;
	case 1:
		glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
		glIndexMask(0xFE);
		break;
	case 2:
		glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
		glIndexMask(0xfd);
		break;
	case 3:
		glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
		glIndexMask(0xfb);
		break;
	}
}

/////////////////////////////////////////////////////////////////////

static void CALLBACK KeyPress1(void)
{
	mode1=!mode1;
}

/////////////////////////////////////////////////////////////////////

static void CALLBACK KeyPress2(void)
{
	mode2=!mode2;
}

/////////////////////////////////////////////////////////////////////

static void CALLBACK KeyPress3(void)
{
	RotateColorMask();
}

/////////////////////////////////////////////////////////////////////

static void Viewport(GLint row,GLint column)
{
	GLint x,y;

	boxW=(windW-(COLS+1)*GAP)/COLS;
	boxH=(windH-(ROWS+1)*GAP)/ROWS;

	x=GAP+column*(boxW+GAP);
	y=GAP+row*(boxH+GAP);

	glViewport(x,y,boxW,boxH);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-boxW/2,boxW/2,-boxH/2,boxH/2,0.0,1.0);
	glMatrixMode(GL_MODELVIEW);
	glEnable(GL_SCISSOR_TEST);
	glScissor(x,y,boxW,boxH);
}

/////////////////////////////////////////////////////////////////////

static void Point(void)
{
	GLint i;

	glBegin(GL_POINTS);
	   AUX_SETCOLOR(windType,AUX_WHITE);
	   glVertex2i(0,0);
	   for(i=1;i<8;i++)
	   {
		   GLint j=i*2;
		   AUX_SETCOLOR(windType,i+AUX_RED-1);
		   glVertex2i(-j,-j);
		   glVertex2i(-j,0);
		   glVertex2i(-j,j);
		   glVertex2i(0,j);
		   glVertex2i(j,j);
		   glVertex2i(j,0);
		   glVertex2i(j,-j);
		   glVertex2i(0,-j);
	   }
	glEnd();
}

/////////////////////////////////////////////////////////////////////

static void Lines(void)
{
	GLint i;

	glPushMatrix();

	glTranslatef(-12,0,0);
	for(i=1;i<8;i++)
	{
		AUX_SETCOLOR(windType,i+AUX_RED-1);
		glBegin(GL_LINES);
		   glVertex2i(-boxW/4,-boxH/4);
		   glVertex2i(boxW/4,boxH/4);
		glEnd();
		glTranslatef(4,0,0);
	}

	glPopMatrix();

	glBegin(GL_LINES);
	   glVertex2i(0,0);
	glEnd();
}

/////////////////////////////////////////////////////////////////////

static void LineStrip(void)
{
	glBegin(GL_LINE_STRIP);
	   AUX_SETCOLOR(windType,AUX_RED);
	   glVertex2f(PIXEL_CENTER(-boxW/4),PIXEL_CENTER(-boxH/4));
	   AUX_SETCOLOR(windType,AUX_GREEN);
	   glVertex2f(PIXEL_CENTER(-boxW/4),PIXEL_CENTER(boxH/4));
	   AUX_SETCOLOR(windType,AUX_BLUE);
	   glVertex2f(PIXEL_CENTER(boxW/4),PIXEL_CENTER(boxH/4));
	   AUX_SETCOLOR(windType,AUX_WHITE);
	   glVertex2f(PIXEL_CENTER(boxW/4),PIXEL_CENTER(-boxH/4));
	glEnd();

	glBegin(GL_LINE_STRIP);
	   glVertex2i(0,0);
	glEnd();
}

/////////////////////////////////////////////////////////////////////

static void LineLoop(void)
{
	glBegin(GL_LINE_LOOP);
	   AUX_SETCOLOR(windType,AUX_RED);
	   glVertex2f(PIXEL_CENTER(-boxW/4),PIXEL_CENTER(-boxH/4));
	   AUX_SETCOLOR(windType,AUX_GREEN);
	   glVertex2f(PIXEL_CENTER(-boxW/4),PIXEL_CENTER(boxH/4));
	   AUX_SETCOLOR(windType,AUX_BLUE);
	   glVertex2f(PIXEL_CENTER(boxW/4),PIXEL_CENTER(boxH/4));
	   AUX_SETCOLOR(windType,AUX_WHITE);
	   glVertex2f(PIXEL_CENTER(boxW/4),PIXEL_CENTER(-boxH/4));
	glEnd();

	glEnable(GL_LOGIC_OP);
	glLogicOp(GL_XOR);

	glEnable(GL_BLEND);
	glBlendFunc(GL_ONE,GL_ONE);

	AUX_SETCOLOR(windType,AUX_MAGENTA);
	glBegin(GL_LINE_LOOP);
	   glVertex2f(PIXEL_CENTER(-boxW/8),PIXEL_CENTER(-boxH/8));
	   glVertex2f(PIXEL_CENTER(-boxW/8),PIXEL_CENTER(boxH/8));
	glEnd();

	glBegin(GL_LINE_LOOP);
	   glVertex2f(PIXEL_CENTER(-boxW/8),PIXEL_CENTER(boxH/8+5));
	   glVertex2f(PIXEL_CENTER(boxW/8),PIXEL_CENTER(boxH/8+5));
	glEnd();
	glDisable(GL_LOGIC_OP);
	glDisable(GL_BLEND);

	AUX_SETCOLOR(windType,AUX_GREEN);
	glBegin(GL_POINTS);
	   glVertex2i(0,0);
	glEnd();

	glBegin(GL_LINE_LOOP);
	   glVertex2i(0,0);
	glEnd();
}

/////////////////////////////////////////////////////////////////////

static void Bitmap(void)
{
	glBegin(GL_LINES);
	   AUX_SETCOLOR(windType,AUX_GREEN);
	   glVertex2i(-boxW/2,0);
	   glVertex2i(boxW/2,0);
	   glVertex2i(0,-boxH/2);
	   glVertex2i(0,boxH/2);
	   AUX_SETCOLOR(windType,AUX_RED);
	   glVertex2i(0,-3);
	   glVertex2i(0,-3+OPENGL_HEIGHT);
	   AUX_SETCOLOR(windType,AUX_BLUE);
	   glVertex2i(0,-3);
	   glVertex2i(OPENGL_WIDTH,-3);
	glEnd();

	AUX_SETCOLOR(windType,AUX_GREEN);

	glPixelStorei(GL_UNPACK_LSB_FIRST,GL_TRUE);
	glPixelStorei(GL_UNPACK_ALIGNMENT,1);

	glRasterPos2i(0,0);
	glBitmap(OPENGL_WIDTH,OPENGL_HEIGHT,0,3,0.0,0.0,OpenGL_bits);
}

/////////////////////////////////////////////////////////////////////

static void Triangles(void)
{
	glBegin(GL_TRIANGLES);
		AUX_SETCOLOR(windType,AUX_GREEN);
		glVertex2i(-boxW/4,-boxH/4);
		AUX_SETCOLOR(windType,AUX_RED);
		glVertex2i(-boxW/8,-boxH/16);
		AUX_SETCOLOR(windType,AUX_BLUE);
		glVertex2i(boxW/8,-boxH/16);

		AUX_SETCOLOR(windType,AUX_GREEN);
		glVertex2i(-boxW/4,boxH/4);
		AUX_SETCOLOR(windType,AUX_RED);
		glVertex2i(-boxW/8,boxH/16);
		AUX_SETCOLOR(windType,AUX_BLUE);
		glVertex2i(boxW/8,boxH/16);
	glEnd();

	glBegin(GL_TRIANGLES);
	    glVertex2i(0,0);
		glVertex2i(-100,100);
	glEnd();
}

/////////////////////////////////////////////////////////////////////

static void TriangleStrip(void)
{
	glBegin(GL_TRIANGLE_STRIP);
	    AUX_SETCOLOR(windType,AUX_GREEN);
		glVertex2i(-boxW/4,-boxH/4);
		AUX_SETCOLOR(windType,AUX_RED);
		glVertex2i(-boxW/4,boxH/4);
		AUX_SETCOLOR(windType,AUX_BLUE);
		glVertex2i(0,-boxH/4);
		AUX_SETCOLOR(windType,AUX_WHITE);
		glVertex2i(0,boxH/4);
		AUX_SETCOLOR(windType,AUX_CYAN);
		glVertex2i(boxW/4,boxH/4);
		AUX_SETCOLOR(windType,AUX_YELLOW);
		glVertex2i(boxW/4,boxH/4);
	glEnd();

	glBegin(GL_TRIANGLE_STRIP);
	    glVertex2i(0,0);
		glVertex2i(-100,100);
	glEnd();
}

/////////////////////////////////////////////////////////////////////

static void TriangleFan(void)
{
	GLint vx[8][2];
	GLint x0,y0,x1,y1,x2,y2,x3,y3;
	GLint i;

	y0=-boxH/4;
	y1=y0+boxH/2/3;
	y2=y1+boxH/2/3;
	y3=boxH/4;
	x0=-boxW/4;
	x1=x0+boxW/2/3;
	x2=x1+boxW/2/3;
	x3=boxW/4;

	vx[0][0]=x0;vx[0][1]=y1;
	vx[1][0]=x0;vx[1][1]=y2;
	vx[2][0]=x1;vx[2][1]=y3;
	vx[3][0]=x2;vx[3][1]=y3;
	vx[4][0]=x3;vx[4][1]=y2;
	vx[5][0]=x3;vx[5][1]=y1;
	vx[6][0]=x2;vx[6][1]=y0;
	vx[7][0]=x1;vx[7][1]=y0;

	glBegin(GL_TRIANGLE_FAN);
	    AUX_SETCOLOR(windType,AUX_WHITE);
		glVertex2i(0,0);
		for(i=0;i<8;i++)
		{
			AUX_SETCOLOR(windType,AUX_WHITE-i);
			glVertex2iv(vx[i]);
		}
	glEnd();

	glBegin(GL_TRIANGLE_FAN);
	    glVertex2i(0,0);
		glVertex2i(-100,100);
	glEnd();
}

/////////////////////////////////////////////////////////////////////

static void Rect(void)
{
	AUX_SETCOLOR(windType,AUX_GREEN);
	glRecti(-boxW/4,-boxH/4,boxW/4,boxH/4);
}

/////////////////////////////////////////////////////////////////////

static void xPolygon(void)
{
	GLint vx[8][2];
	GLint x0,y0,x1,y1,x2,y2,x3,y3;
	GLint i;

	y0=-boxH/4;
	y1=y0+boxH/2/3;
	y2=y1+boxH/2/3;
	y3=boxH/4;
	x0=-boxW/4;
	x1=x0+boxW/2/3;
	x2=x1+boxW/2/3;
	x3=boxW/4;

	vx[0][0]=x0;vx[0][1]=y1;
	vx[1][0]=x0;vx[1][1]=y2;
	vx[2][0]=x1;vx[2][1]=y3;
	vx[3][0]=x2;vx[3][1]=y3;
	vx[4][0]=x3;vx[4][1]=y2;
	vx[5][0]=x3;vx[5][1]=y1;
	vx[6][0]=x2;vx[6][1]=y0;
	vx[7][0]=x1;vx[7][1]=y0;

	glBegin(GL_POLYGON);
		for(i=0;i<8;i++)
		{
			AUX_SETCOLOR(windType,AUX_WHITE-i);
			glVertex2iv(vx[i]);
		}
	glEnd();

	glBegin(GL_POLYGON);
	    glVertex2i(0,0);
		glVertex2i(-100,100);
	glEnd(); 
}

/////////////////////////////////////////////////////////////////////

static void Quads(void)
{
	glBegin(GL_QUADS);
	    AUX_SETCOLOR(windType,AUX_GREEN);
		glVertex2i(-boxW/4,-boxH/4);
		AUX_SETCOLOR(windType,AUX_RED);
		glVertex2i(-boxW/8,-boxH/16);
		AUX_SETCOLOR(windType,AUX_BLUE);
		glVertex2i(boxW/8,-boxH/16);
		AUX_SETCOLOR(windType,AUX_WHITE);
		glVertex2i(boxW/4,-boxH/4);

	    AUX_SETCOLOR(windType,AUX_GREEN);
		glVertex2i(-boxW/4,boxH/4);
		AUX_SETCOLOR(windType,AUX_RED);
		glVertex2i(-boxW/8,boxH/16);
		AUX_SETCOLOR(windType,AUX_BLUE);
		glVertex2i(boxW/8,boxH/16);
		AUX_SETCOLOR(windType,AUX_WHITE);
		glVertex2i(boxW/4,boxH/4);
	glEnd();

	glBegin(GL_QUADS);
	    glVertex2i(0,0);
		glVertex2i(100,100);
		glVertex2i(-100,100);
	glEnd();
}

static void QuadStrip(void)
{
	glBegin(GL_QUAD_STRIP);
	    AUX_SETCOLOR(windType,AUX_GREEN);
		glVertex2i(-boxW/4,-boxH/4);
		AUX_SETCOLOR(windType,AUX_RED);
		glVertex2i(-boxW/4,boxH/4);
		AUX_SETCOLOR(windType,AUX_BLUE);
		glVertex2i(0,-boxH/4);
		AUX_SETCOLOR(windType,AUX_WHITE);
		glVertex2i(0,boxH/4);
		AUX_SETCOLOR(windType,AUX_CYAN);
		glVertex2i(boxW/4,boxH/4);
		AUX_SETCOLOR(windType,AUX_YELLOW);
		glVertex2i(boxW/4,boxH/4);
	glEnd();

	glBegin(GL_TRIANGLE_STRIP);
	    glVertex2i(0,0);
		glVertex2i(100,100);
		glVertex2i(-100,100);
	glEnd();
}

/////////////////////////////////////////////////////////////////////

static void CALLBACK Paint(void)
{
	glViewport(0,0,windW,windH);
	glDisable(GL_SCISSOR_TEST);

	glPushAttrib(GL_COLOR_BUFFER_BIT);

	glColorMask(1,1,1,1);
	glIndexMask((GLuint)~0);

	glClearColor(0.0,0.0,0.0,0.0);
	glClear(GL_COLOR_BUFFER_BIT);

	glPopAttrib();

	if(mode1)glShadeModel(GL_SMOOTH);
	else glShadeModel(GL_FLAT);

	if(mode2)glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
	else glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

	Viewport(0,0); Point();
	Viewport(0,1); Lines();
	Viewport(0,2); LineStrip();
	Viewport(0,3); LineLoop();

	Viewport(1,0); Bitmap();

	Viewport(1,1); TriangleFan();
	Viewport(1,2); Triangles();
	Viewport(1,3); TriangleStrip();
	Viewport(2,0); Rect();
	Viewport(2,1); xPolygon();
	Viewport(2,2); Quads();
	Viewport(2,3); QuadStrip();

	glFlush();

	if(doubleBuffer)auxSwapBuffers();
}

static GLenum Args(int argc,char **argv)
{
	GLint i;

	rgb=GL_TRUE;
	doubleBuffer=GL_FALSE;

	for(i=1;i<argc;i++)
	{
		if(strcmp(argv[i],"-ci")==0)rgb==GL_FALSE;
		else if(strcmp(argv[i],"-rgb")==0)rgb==GL_TRUE;
		else if(strcmp(argv[i],"-sb")==0)doubleBuffer=GL_FALSE;
		else if(strcmp(argv[i],"-db")==0)doubleBuffer=GL_TRUE;
		else
		{
		//printf("%s(Bad option).\n",argv[i]);
			return GL_FALSE;
		}
	}
	return GL_TRUE;
}

/////////////////////////////////////////////////////////////////////

void main(int argc,char **argv) 
{
	if(Args(argc,argv)==GL_FALSE)auxQuit();

	windW=600;
	windH=300;
	auxInitPosition(0,0,windW,windH);
	
	windType|=(rgb)?AUX_RGB:AUX_INDEX;
	windType|=(doubleBuffer)?AUX_DOUBLE:AUX_SINGLE;

	auxInitDisplayMode(windType);

	if(auxInitWindow("Primitive Test")==GL_FALSE)auxQuit();

	Init();
	auxExposeFunc((AUXEXPOSEPROC)Resize);
	auxReshapeFunc((AUXRESHAPEPROC)Resize);
	auxKeyFunc(AUX_1,KeyPress1);
	auxKeyFunc(AUX_2,KeyPress2);
	auxKeyFunc(AUX_3,KeyPress3);
	auxMainLoop(Paint);
}

/////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -