OpenGL之再向虎山行[1]:重学OpenGL
要说图形学,不是不懂,而是没有系统的学习与复习,所以至今还属于半吊子,随便写些东西,也必须有书在侧。
再向虎山行,就是想在今年之内圆了梦想,能够有些东西出来。
>> OpenGL Diagnosis Tool
做WebService开发时,感觉抓包工具益处良多,所以图形开发也从diagnosis工具开始,这次居然很快就有了功效:
在一个glDrawRangeElements联系中,居然编译不过,借助于OpenGL Extensions Viewer与Dependency Viewer,原来Windows下根本就不支持。
http://www.realtech-vr.com/glview/
比较NB的是,这家伙在Apple AppStore与Mac AppStore上也有。
可以看到,并不支持OpenGL函数 glDrawRangeElements,用Dependency Walker查看可以印证:
其实还有什么gDEBugger 之类的,那也太高级了。
>> 查询OpenGL Information方法
void queryGlInfomationGLInfo(HDC hdc)
{
char* str = 0;
int colorBits[4]; // (r,g,b,a)
int depthBits;
int stencilBits;
int maxTextureSize;
int maxLights;
int maxAttribStacks;
int maxModelViewStacks;
int maxProjectionStacks;
int maxClipPlanes;
int maxTextureStacks;
int pixelFormat;
// get vendor string
str = (char*)glGetString(GL_VENDOR);
// get renderer string
str = (char*)glGetString(GL_RENDERER);
// get version string
str = (char*)glGetString(GL_VERSION);
// get all extensions as a string
str = (char*)glGetString(GL_EXTENSIONS);
// get number of color bits
glGetIntegerv(GL_RED_BITS, &colorBits[0]);
glGetIntegerv(GL_GREEN_BITS, &colorBits[1]);
glGetIntegerv(GL_BLUE_BITS, &colorBits[2]);
glGetIntegerv(GL_ALPHA_BITS, &colorBits[3]);
// get depth bits
glGetIntegerv(GL_DEPTH_BITS, &depthBits);
// get stecil bits
glGetIntegerv(GL_STENCIL_BITS, &stencilBits);
// get max number of lights allowed
glGetIntegerv(GL_MAX_LIGHTS, &maxLights);
// get max texture resolution
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
// get max number of clipping planes
glGetIntegerv(GL_MAX_CLIP_PLANES, &maxClipPlanes);
// get max modelview and projection matrix stacks
glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH, &maxModelViewStacks);
glGetIntegerv(GL_MAX_PROJECTION_STACK_DEPTH, &maxProjectionStacks);
glGetIntegerv(GL_MAX_ATTRIB_STACK_DEPTH, &AttribStacks);
// get max texture stacks
glGetIntegerv(GL_MAX_TEXTURE_STACK_DEPTH, &info.maxTextureStacks);
// get the current pixel format
pixelFormat = GetPixelFormat(hdc);
}
>> 跨平台OpenGL Library
一个glDrawRangeElement的缺失,着实让我学的一个封装良好的OpenGL库很有用处,Google了一把,发现了glext, glew这类东西。
还是以glew中的glDrawRangeElements为例:
// Header
// States
#define GL_TRIANGLES 0x0004
#define GL_TRIANGLE_STRIP 0x0005
#define GL_TRIANGLE_FAN 0x0006
#define GL_QUADS 0x0007
#define GL_QUAD_STRIP 0x0008
// Function Pointer
typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements)
GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements;
// Implementation:
PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL;
glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElements"))
这样一来,就可以直接用glDrawRangeElements,当然了,前提还是要有glDrawRangeElements这个函数导出啊,否则巧妇也难为无米之炊。
其实,A公司的O库,也有这么一套玩意儿。
>> GLUT
标签:
Graphics
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述