学习OpenGL半年了,虽然大部分函数还从来没接触过,但对其编程框架有了一定的认识。于是开始考虑OpenGL纯软件实现的可能性,当然实验的平台还是在PC,只是在帧缓冲区渲染完毕后通过ddraw页面发送到显卡。
现在已经完成了最常用的近30个函数,如下所示。命名形式,参数格式都尽量沿用OpenGL标准,但因为很多功能尚不完全,所以也精简了不少的参数,而且前缀也改为TGL(Tiny Graphic Lib),可以无视。
void tglInit(HINSTANCE);
void tglExit(void);
void tglIdleFunc(void(*idle)(void));
void tglKeyFunc(void(*key)(int));
void tglMainLoop(void);
void tglLoadIdentity(void);
void tglPopMatrix(void);
void tglPushMatrix(void);
void tglMultMatrix(float*);
void tglPerspective(float,float);
void tglLookAt(float*,float*);
void tglTranslate(float,float,float);
void tglRotate(float,float,float,float);
void tglGetFloatv(float*);
void tglClearColor(float,float,float);
void tglClear(BYTE);
void tglEnable(BYTE);
void tglDisable(BYTE);
void tglBegin(BYTE);
void tglVertex(float,float,float);
void tglColor(float,float,float);
void tglEnd(void);
void tglSwapBuffers(void);
void tglBuild2DMipmaps(WORD,WORD,WORD*);
void tglTexCoord(float,float);
void tglGenTextures(BYTE*);
void tglBindTexture(BYTE);
void tglDeleteTextures(BYTE);
测试程序1:高洛德着色
#include "tgl.h"
short y=0;
short speed = 1;
void keyEvent(int key)
{
if(key==VK_ESCAPE)
tglExit();
if(key==VK_UP)
speed++;
if(key==VK_DOWN)
speed--;
}
void render(void)
{
float eye[3] = {0,0,-8};
float at[3] = {0,0,0};
tglClear(TGL_COLOR_BUFFER_BIT|TGL_DEPTH_BUFFER_BIT);
tglLoadIdentity();
tglLookAt(eye,at);
tglRotate((float)y,0,1,0);
tglBegin(TGL_TRIANGLES);
tglColor(1,0,0);
tglVertex(0,2,0);
tglColor(0,1,0);
tglVertex( -1.732f ,-1,0);
tglColor(0,0,1);
tglVertex( 1.732f ,-1,0);
tglEnd();
tglSwapBuffers();
y=(y+speed)%360;
}
void main(HINSTANCE hInstance)
{
tglInit(hInstance);
tglPerspective( 0.1f , 300.0f );
tglEnable(TGL_DEPTH_TEST);
tglClearColor(1,1,1);
tglIdleFunc(render);