标签: opengl

OpenGL实践 - 运行没有核心版本的OpenGL

我不确定这是一个问题或意见需要由用户塑造,但我们走了.

问题:即使我想支持最新版本和扩展,我是否应该在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是否还在等待董事会批准,或者它是否已经是核心的一部分,从标题和函数名称来判断.

对于文本墙感到抱歉,对主题的一些输入将不胜感激.

opengl glew

0
推荐指数
1
解决办法
639
查看次数

三角网格的索引缓冲区有什么意义

假设我有三角网格,那么我在三角形之间有很多重复的位置,在这种情况下索引缓冲区可能变得非常方便.

但是如果我也需要法线,那么就没有增益,因为所有三角形都有不同的法线.所以元组{position,normal}是唯一的.如果添加纹理坐标和其他功能,那么我不明白为什么需要索引缓冲区?

opengl directx render index-buffer

0
推荐指数
1
解决办法
382
查看次数

glLoadMatrix()替换

移植我的游戏新的OpenGL版本(3.2以上版本)后,我注意到,glLoadMatrix()glMultMatrix()被拆除.他们有替代品吗?我不想使用任何库,因为我有自己的矩阵堆栈.

opengl matrix deprecated

0
推荐指数
1
解决办法
2210
查看次数

为什么OpenGL在创建/释放资源时会获取指向资源ID的指针?

我想知道为什么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)的位置就无效.

我对此进行了测试,看起来并没有让应用程序崩溃,但我很担心.

  1. 为什么OpenGL要我在CreateVertexArrays/DeleteVertexArrays时传递地址?
  2. 这段代码对你来说安全吗?

下面是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)

c++ opengl

0
推荐指数
1
解决办法
83
查看次数

SWING有时比openGL更快

我想弄清楚在渲染简单方块时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)

java opengl swing lwjgl

0
推荐指数
1
解决办法
659
查看次数

如何强制openGL绘制非凸填充多边形

多边形以凸起形状绘制似乎是标准.请参阅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)

c opengl drawing polygon

0
推荐指数
1
解决办法
3493
查看次数

GL_QUADS状态不支持多个glBindTexture?

简而言之,为什么我不能将两个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)

opengl texture-mapping

0
推荐指数
1
解决办法
510
查看次数

glOrtho影响gluPerspective

到目前为止我虽然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

opengl opengl-es

0
推荐指数
1
解决办法
271
查看次数

多重定义:难倒

我有一个使用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)

c++ opengl definitions

0
推荐指数
1
解决办法
459
查看次数

在opengl中渲染到纹理

我得到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)

opengl

0
推荐指数
1
解决办法
365
查看次数