我不确定这是一个问题或意见需要由用户塑造,但我们走了.
问题:即使我想支持最新版本和扩展,我是否应该在1.1版兼容性配置文件中运行openGL?更多信息提前.
某些功能要求您提供可能需要支持的openGL版本,如果要支持openGL核心配置文件或3.0及更高版本,则最常用.例子 :
SDL:
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR/MINOR_VERSION, major/minor version);GLX:
glXCreateContextAttribsARB, GLX_CONTEXT_MAJOR_VERSION_ARB, GLX_CONTEXT_MINOR_VERSION_ARB
我有一些问题(实际上有几个)与openGL版本和扩展系列.
问题#1 - 查询OpenGL版本:如果我没记错的话,它从Mesa3D Mesa 7.11开始,尝试从中查询GL_VERSION,我得到:
"Mesa 7.11 OpenGL 2.1配置文件"
知道glew以及其他项目解析器,他们只查找字符串中的第一个点,并返回点所在的数字,作为字符串(您可以选择转换为浮点)
来自Glew 1.9.0:代码片段 上面的例子确实返回了"openGL"版本7.0,它实际上是MESA3D驱动程序版本,这使我认为它不可靠.
问题#2 - 使用与以前相同的MESA3D驱动程序扩展(MISSING,OK?):7.11,运行Glewinfo(glew 1.9.0)给了我以下内容:
GL_ARB_texture_storage:MISSING OK
glTexStorage1D:好的
glTexStorage2D:好的
glTexStorage3D:好的
glTextureStorage1DEXT:好的
glTextureStorage2DEXT:好的
glTextureStorage3DEXT:好的
请注意,尝试从"GL_ARB_texture_storage"API检索(导入)函数地址会导致失败(NULL指针).
我解决上述两个问题的方法是在兼容模式下将openGL初始化为版本1.1,并通过检查我可能需要的每个API系列来强制我的方式,如果openGL作为一组独立的API工作.自己的方式,但一起工作,我们不应该以这样的方式对待它们,代码明智,而不是假设它们在那里,如果你有一个核心版本?再次使用MESA3D 7.11 openGL 2.1,我仍然可以使用openGL 3.0等功能,例如"glGenerateMipmap"
**我试图避免版本和扩展字符串的方式是:**
1.)在兼容模式下初始化openGL 1.1.
2.)通过导入核心功能来扫描您可能需要的API.
3.)如果你无法获得核心功能,请尝试通过扩展来获取功能(如果存在)(不需要与扩展名列表"GL_EXTENSIONS"进行字符串比较)
4.)如果您无法获得这些功能,请尝试通过编写自己的功能来模拟它们.
5.)如果上述方法都不起作用,那就放弃吧.
6.)如果上述方法中的任何内容有效,请运行完整性测试并确保函数正常工作,例如:glGetError和断言应该有效.
你认为它安全/有效吗?我是否通过调用最小版本并试图强行进入我的方式而错过了什么?有没有办法可以改善它?*旁注 - 我知道openGL核心配置文件删除了过时的功能,但您可以自己选择不使用它们,如果您的驱动程序支持最新版本.我也知道openGL可能会尝试模拟当前版本之外的函数,取决于你的驱动程序,你仍然可以使用glGenerateMipmap(openGL 3.0函数)和openGL 2.1
问题#3 - 命名约定,Core,ARB和glew.**我还不确定名称约定是如何工作的,例如:似乎你在GL版本4.3中的"GL_ARB_debug_output"中有函数"glDebugMessageCallbackARB"和glDebugMessageCallback,看起来没问题,但是看看上面第2期的例子,你可能会在"GL_ARB_texture_storage"里面看到函数:glTexStorage1D,没有ARB后缀.
我的问题是,我怎么知道API是否还在等待董事会批准,或者它是否已经是核心的一部分,从标题和函数名称来判断.
对于文本墙感到抱歉,对主题的一些输入将不胜感激.
假设我有三角网格,那么我在三角形之间有很多重复的位置,在这种情况下索引缓冲区可能变得非常方便.
但是如果我也需要法线,那么就没有增益,因为所有三角形都有不同的法线.所以元组{position,normal}是唯一的.如果添加纹理坐标和其他功能,那么我不明白为什么需要索引缓冲区?
移植我的游戏新的OpenGL版本(3.2以上版本)后,我注意到,glLoadMatrix()和glMultMatrix()被拆除.他们有替代品吗?我不想使用任何库,因为我有自己的矩阵堆栈.
我想知道为什么OpenGL会将指针指向资源ID,因为我正在做这样的事情:
#include "OglResource.h"
#include <iostream>
void WINAPI DeleteVertexArray( GLuint item )
{
glDeleteVertexArrays(1, &item);
}
OglResource MakeOglResource( GLenum type )
{
switch( type )
{
case GL_VERTEX_SHADER:
return OglResource(glCreateShader(GL_VERTEX_SHADER), (OglResource::ReleaseFunc)glDeleteShader, GL_VERTEX_SHADER);
break;
case GL_FRAGMENT_SHADER:
return OglResource(glCreateShader(GL_FRAGMENT_SHADER), (OglResource::ReleaseFunc)glDeleteShader, GL_FRAGMENT_SHADER);
break;
case GL_VERTEX_ARRAY:
{
GLuint out = OglResource::INVALID_OGL_RESOURCE_ID;
glGenVertexArrays(1, &out);
return OglResource(out, DeleteVertexArray, GL_VERTEX_ARRAY);
}
break;
}
return OglResource();
}
Run Code Online (Sandbox Code Playgroud)
如果传递给OpenGL的资源ID的地址确实很重要,这很危险,因为只要MakeOglResource函数返回,我传递给OpenGL(&out)的位置就无效.
我对此进行了测试,看起来并没有让应用程序崩溃,但我很担心.
下面是OglResource的实现:
#ifndef _HANDLE_H
#define _HANDLE_H
#include <memory>
#include <functional>
#define CALL_CONVENTION WINAPI
template <typename HANDLE_TYPE>
class Handle
{ …Run Code Online (Sandbox Code Playgroud) 我想弄清楚在渲染简单方块时openGL(LWJGL)和swing之间有什么区别.不出所料,openGL赢了,但在某些测试中,结果很接近,甚至有利于摆动.为什么会这样?
我的测试结果:
Testing for a total of 500000 rectangles
Swing time: 0.16367821
OpenGL time: 0.06317429
OpenGL relative to SWING is faster by 159.0899%
Testing for a total of 750000 rectangles
OpenGL time: 0.066062525
Swing time: 0.16988374
OpenGL relative to SWING is faster by 157.156%
Testing for a total of 1000000 rectangles
OpenGL time: 0.0907693
Swing time: 0.15694521
OpenGL relative to SWING is faster by 72.90561%
Testing for a total of 1250000 rectangles
OpenGL time: 0.09591239
Swing time: 0.17011923
OpenGL relative …Run Code Online (Sandbox Code Playgroud) 多边形以凸起形状绘制似乎是标准.请参阅stackoverflow.com/questions/15556929/open-gl-polygon但是,如果我选择填充它,则不适合我.如何在保持我定义的形状的同时填充多边形?
void drawFloor(){
// White
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // GL_LINE works the way I want it too
//glDisable(GL_POLYGON_SMOOTH); // has no effect :(
glBegin(GL_POLYGON);
glColor3f(1.0, 1.0, 1.0);
glVertex3f(0, 0, 0); //0
glVertex3f(2*boxSize, 0, 0); //1
glVertex3f(2 * boxSize, -boxSize, 0); //2
glVertex3f(5 * boxSize, -boxSize, 0); //3
glVertex3f(5 * boxSize, 4 * boxSize, 0); //4
glVertex3f(6 * boxSize, 4 * boxSize, 0); //5
glVertex3f(6 * boxSize, 6 * boxSize, 0); //6
glVertex3f(0 * boxSize, 6 * boxSize, 0); //7
glVertex3f(0 * …Run Code Online (Sandbox Code Playgroud) 简而言之,为什么我不能将两个glBindTexture放入一个glBegin(GL_QUADS)... glEnd()?
我正在关注OpenGL红皮书第9章,http://www.glprogramming.com/red/chapter09.html
在例9-5中,程序texbind.c生成两个具有不同纹理的四边形,如下所示:

左边的四边形有一个白色的棋盘格纹,而右边的四边形有一个红色的棋盘格.
这是将纹理映射到两个四边形的代码:
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texName[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);
glEnd();
glBindTexture(GL_TEXTURE_2D, texName[1]);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421);
glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);
glEnd();
glFlush();
}
Run Code Online (Sandbox Code Playgroud)
我们可以看到,即使代码使用GL_QUADS,它也会在每个GL_QUADS状态中绘制一个四元组.但是,如果我在这段代码的中间注释掉glEnd()和glBegin(GL_QUADS),就像这样:
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texName[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0); …Run Code Online (Sandbox Code Playgroud) 到目前为止我虽然glOrtho设置了一个正面相机,而gluPerspective设置了一个透视相机.
但是如果我在gluPerspective之前有一个glOrtho调用,那么这也会影响透视摄像机所在的位置.
例如:
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glOrthof(0, 1, 0, 2, -100, 100);
GLU.gluPerspective(gl, 90, 1, 0.1f, 100.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
GLU.gluLookAt(gl, 0f, 0f, -5.0f,
0f, 0f, 0.0f,
0.0f, 1.0f, 0.0f);
Run Code Online (Sandbox Code Playgroud)
这将把我的对象放在右下角.但我希望gluPerspective能够覆盖glOrtho
我有一个使用FreeGLUT,OpenGL和Eliot Eshelman的一些很好的单工噪声函数的简单程序.我的目标是显示2D切片一些3D单一噪声,这是我用SDL管理的.
我的问题是:我得到了多个定义错误,我似乎无法解决.
我在谷歌和这些论坛上搜索了一段时间.我了解了很多可能导致错误的事情,但我似乎无法找到我的原因.我被这些错误困扰了好几个小时.
这是我的相关来源和错误输出.
请注意,我遇到的错误可能会有更多的错误,但我还没有足够的调试来达到它们.
输出:
-------------- Build: Release in OpenGL Test (compiler: GNU GCC Compiler)---------------
mingw32-g++.exe -Wall -O2 -std=c++11 -IC:\freeglut\include -c "C:\OpenGL Test\OpenGL Test\main.cpp" -o obj\Release\main.o
mingw32-g++.exe -LC:\freeglut\lib -o "bin\Release\OpenGL Test.exe" obj\Release\LUtil.o obj\Release\main.o obj\Release\simplexnoise.o -s -lmingw32 -lOpenGL32 -lglu32 -lfreeglut -mwindows
obj\Release\main.o:main.cpp:(.bss+0x0): multiple definition of `textureName'
obj\Release\LUtil.o:LUtil.cpp:(.bss+0x0): first defined here
obj\Release\main.o:main.cpp:(.bss+0x20): multiple definition of `noiseImage'
obj\Release\LUtil.o:LUtil.cpp:(.bss+0x20): first defined here
obj\Release\main.o:main.cpp:(.bss+0x12c020): multiple definition of `zOffset'
obj\Release\LUtil.o:LUtil.cpp:(.bss+0x12c020): first defined here
collect2.exe: error: ld returned 1 exit status
Process terminated with status …Run Code Online (Sandbox Code Playgroud) 我得到ERROR:GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT,代码如下.关于我在这里可能缺少的任何想法:
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, 640, 480, 0, GL_RGBA4, GL_UNSIGNED_BYTE, NULL);
glGenFramebuffers(1, &renderTexture);
glBindFramebuffer(GL_FRAMEBUFFER, renderTexture);
//glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
GLint val = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(val != GL_FRAMEBUFFER_COMPLETE)
{
std::cout <<"\n Error in framebuffer : 2";
}
Run Code Online (Sandbox Code Playgroud)
这里有其余的代码用于渲染和blit默认FB.But不会渲染任何想法吗?期望默认FB上的绿色清除
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f,1.0f,0.0f,0.0f);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindFramebuffer(GL_READ_FRAMEBUFFER, renderTexture);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
val = glGetError();
if( val == GL_NO_ERROR)
std::cout<<"\n Bind Fine";
val = glCheckFramebufferStatus(GL_FRAMEBUFFER); …Run Code Online (Sandbox Code Playgroud)