#include "render.h"
#include <malloc.h>
#include <gl/gl.h>
#include <gl/glu.h>
#pragma comment(lib, "OpenGL32.lib")
#pragma comment(lib, "glu32.lib")
struct Canvas {
int w;
int h;
int alpha;
GLuint texture;
};
typedef int (__stdcall *SWAPBUFFERS)(HDC);
static SWAPBUFFERS wglSwapBuffers = NULL;
static HDC G_hdc = NULL;
static HGLRC G_hrc = NULL;
static int G_lock = 0;
static PIXELFORMATDESCRIPTOR G_pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // 上述格式描述符的大小
1, // 版本号
PFD_DRAW_TO_WINDOW | // 格式支持窗口
PFD_SUPPORT_OPENGL | // 格式必须支持OpenGL
PFD_DOUBLEBUFFER, // 必须支持双缓冲
PFD_TYPE_RGBA, // 申请 RGBA 格式
0, // 选定色彩深度
0, 0, 0, 0, 0, 0, // 忽略的色彩位
0, // 无Alpha缓存
0, // 忽略Shift Bit
0, // 无累加缓存
0, 0, 0, 0, // 忽略聚集位
16, // 16位 Z-缓存 (深度缓存)
0, // 无蒙板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主绘图层
0, // Reserved
0, 0, 0 // 忽略层遮罩
};
int Render_Init(HDC hdc, int w, int h, int bpp)
{
int pf;
HMODULE dll = NULL;
G_hdc = hdc;
G_pfd.cColorBits = bpp;
if ( !(pf = ChoosePixelFormat(hdc, &G_pfd)) )
return 0;
if ( !SetPixelFormat(hdc, pf, &G_pfd) )
return 0;
if ( !(G_hrc = wglCreateContext(hdc)) )
return 0;
if ( !wglMakeCurrent(hdc, G_hrc) )
return 0;
if ( !(dll = LoadLibrary("OpenGL32.dll")) )
return 0;
if ( !(wglSwapBuffers = (SWAPBUFFERS)GetProcAddress(dll, "wglSwapBuffers")) )
wglSwapBuffers = SwapBuffers;
G_lock = 0;
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
Render_Reshape(w, h);
return 1;
}
void Render_Reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0f, (GLfloat)w, 0.0f, (GLfloat)h);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void Render_Ready()
{
if ( G_lock++ == 0 )
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
void Render_Finish()
{
if ( --G_lock == 0 )
wglSwapBuffers(G_hdc);
}
Canvas * Render_GenCanvas(Bitmap *dib)
{
GLuint tex;
Canvas *canvas = (Canvas *)malloc(sizeof(Canvas));
if ( !canvas )
return NULL;
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dib->w, dib->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, dib->buf);
canvas->w = dib->w;
canvas->h = dib->h;
canvas->alpha = dib->alpha;
canvas->texture = tex;
return canvas;
}
void Render_Color(float r, float g, float b)
{
glColor3f(r, g, b);
}
void Render_Line(int sx, int sy, int dx, int dy)
{
glDisable(GL_TEXTURE_2D);
glBegin(GL_LINES);
glVertex2f((GLfloat)sx, (GLfloat)sy);
glVertex2f((GLfloat)dx, (GLfloat)dy);
glEnd();
glEnable(GL_TEXTURE_2D);
}
void Render_Canvas(Canvas *canvas, int x, int y, int w, int h)
{
glColor3f(1.0f, 1.0f, 1.0f);
glBindTexture(GL_TEXTURE_2D, canvas->texture);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f((GLfloat)x, (GLfloat)y);
glTexCoord2f(1.0f, 0.0f); glVertex2f((GLfloat)(x+w), (GLfloat)y);
glTexCoord2f(1.0f, 1.0f); glVertex2f((GLfloat)(x+w), (GLfloat)(y+h));
glTexCoord2f(0.0f, 1.0f); glVertex2f((GLfloat)x, (GLfloat)(y+h));
glEnd();
}
void Render_SubCanvas(Canvas *canvas, int sx, int sy, int sw, int sh, int x, int y, int w, int h)
{
GLfloat src_x = sx > 0 ? (GLfloat)sx / (GLfloat)canvas->w : 0.0f;
GLfloat src_y = sy > 0 ? (GLfloat)sy / (GLfloat)canvas->h : 0.0f;
GLfloat src_w = (GLfloat)sw / (GLfloat)canvas->w;
GLfloat src_h = (GLfloat)sh / (GLfloat)canvas->h;
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS);
glTexCoord2f(src_x, src_y); glVertex2f((GLfloat)x, (GLfloat)y);
glTexCoord2f(src_x+src_w, src_y); glVertex2f((GLfloat)(x+w), (GLfloat)y);
glTexCoord2f(src_x+src_w, src_y+src_h); glVertex2f((GLfloat)(x+w), (GLfloat)(y+h));
glTexCoord2f(src_x, src_y+src_h); glVertex2f((GLfloat)x, (GLfloat)(y+h));
glEnd();
}
void Render_Release()
{
if ( G_hrc ) {
wglMakeCurrent(NULL, NULL);
wglDeleteContext(G_hrc);
}
}
/* END */

YellowBug
- 粉丝: 6
最新资源
- 部署在阿里云函数计算上的五言绝句自动生成机器学习程序示例
- Java-ssm496图书管理系统的设计与实现+jsp-项目实战毕设源码-MySQL.zip
- Java-ssm591基于JAVA的驾校信息管理系统设计+vue-项目实战毕设源码-MySQL.zip
- Java-ssm521基于成绩管理系统的设计与实现+vue-项目实战毕设源码-MySQL.zip
- Java-ssm048电子竞技管理平台的设计与实现-项目实战毕设源码-MySQL.zip
- Java-ssm675基于java的智能训练管理平台+vue-项目实战毕设源码-MySQL.zip
- Java-ssm677旅社客房收费管理系统+vue-项目实战毕设源码-MySQL.zip
- Java-ssm123基于javaweb的网上书城系统的设计与实现+vue-项目实战毕设源码-MySQL.zip
- Java-ssm127基于乡镇篮球队管理系统-项目实战毕设源码-MySQL.zip
- Java-ssm151大学生就业信息管理系统-项目实战毕设源码-MySQL.zip
- Java-ssm359大学餐厅菜品推荐和点评系统+vue-项目实战毕设源码-MySQL.zip
- Java-ssm773基于Java的民宿预订管理系统的设计与实现+jsp-项目实战毕设源码-MySQL.zip
- Java-ssm262同学录网站+vue-项目实战毕设源码-MySQL.zip
- Java-ssm001高校专业信息管理系统设计与实现-项目实战毕设源码-MySQL.zip
- Java-ssm228图书商城网站的设计和开发+vue-项目实战毕设源码-MySQL.zip
- Java-ssm146基于Spring框架的电子相册系统设计与实现-项目实战毕设源码-MySQL.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



- 1
- 2
- 3
前往页