标签: opengl

MacOSX上的OpenGL头文件在哪里?

在/ usr/include中,

我试过grepping GL gl和OpenGL ..但是找不到它.

这些头文件位于何处?

opengl macos

26
推荐指数
2
解决办法
2万
查看次数

材质和质地有什么区别?

在计算机图形学中,材质和纹理之间有什么区别?

opengl directx graphics

26
推荐指数
4
解决办法
2万
查看次数

OpenGL在辅助线程中渲染

我正在编写一个3D模型查看器应用程序作为业余爱好项目,也作为一个测试平台来尝试不同的渲染技术.我正在使用SDL来处理窗口管理和事件,以及用于3D渲染的OpenGL.我的程序的第一次迭代是单线程的,运行得很好.但是,我注意到单线程程序导致系统变得非常缓慢/滞后.我的解决方案是将所有呈现代码移动到不同的线程中,从而释放主线程来处理事件并防止应用程序无响应.

该解决方案间歇性地工作,程序经常因为主要来自X窗口系统的变化(并且在我看来奇怪)一组错误而崩溃.这让我质疑我最初的假设,即只要我的所有OpenGL调用都发生在创建上下文的线程中,一切都应该仍然有效.在花了一天的大部分时间在互联网上寻找答案后,我彻底难过了.

更简洁:是否可以在主线程以外的线程中使用OpenGL执行3D渲染?我是否仍可以使用此配置的跨平台窗口库(如SDL或GLFW)?有没有更好的方法来做我想做的事情?

到目前为止,我一直在使用C++在Linux(Ubuntu 11.04)上进行开发,尽管如果有一种在这些语言中效果更好的解决方案,我也对Java和Python感到满意.

更新:根据要求,一些澄清:

  • 当我说"系统变得迟钝"时,我的意思是与桌面交互(拖动窗口,与面板交互等)变得比正常情况慢得多.移动我的应用程序的窗口需要几秒钟的时间,而其他交互只是慢到足以令人讨厌.
  • 至于干扰合成窗口管理器...我正在使用Ubuntu 11.04附带的GNOME shell(现在远离Unity ...)我找不到任何禁用桌面效果的选项,例如以前的发行版.我认为这意味着我没有使用合成窗口管理器......虽然我可能是非常错误的.
  • 我认为"X错误"是由于我在终端上收到的错误消息导致的服务器错误.更多细节如下.

我的应用程序的多线程版本出现的错误:

XIO:X服务器上的致命IO错误11(资源暂时不可用)在73个请求(73个已知处理)之后":0.0",剩余0个事件.

X请求失败的错误:BadColor(无效的Colormap参数)失败请求的主要操作码:79(X_FreeColormap)失败请求中的资源ID:0x4600001失败请求的序列号:72输出流中的当前序列号:73

游戏:../../ src/xcb_io.c:140:dequeue_pending_request:断言`req == dpy-> xcb-> pending_requests'失败.中止

我总是得到上面三个错误中的一个,我得到的一个变化,显然是随机的,这(我的眼睛)似乎证实我的问题确实源于我使用线程.请记住,我正在学习,因此我很有可能在我的无知中,我有一些相当愚蠢的东西.

解决方案:对于遇到类似问题的任何人,我通过将调用移至SDL_Init(SDL_INIT_VIDEO)渲染线程并使用互斥锁锁定上下文初始化来解决我的问题.这可以确保在将要使用它的线程中创建上下文,并且它可以防止主循环在初始化任务完成之前启动.启动过程的简化概述:

1)主线程初始化struct将在两个线程之间共享,并包含互斥锁.
2)主线程生成渲染线程并暂停一段时间(1-5ms),使渲染线程有时间锁定互斥锁.暂停后,主线程在尝试锁定互斥锁时阻塞.
3)渲染线程锁互斥,初始化SDL的视频子系统并创建OpenGL上下文.
4)渲染线程解锁互斥锁并进入其"渲染循环".
5)主线程不再被阻塞,因此在完成初始化步骤之前锁定和解锁互斥锁.

请务必阅读答案和评论,那里有很多有用的信息.

opengl multithreading sdl

26
推荐指数
1
解决办法
2万
查看次数

当我在OpenGL中启用照明时,为什么我的颜色会消失?

我正在使用OpenGL API和GLUT在C++中开发一个图形应用程序.

为了添加光照,我在模型视图矩阵中进行了以下更改:

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

// Create light components.
GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f };
GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat position[] = { 0.0f, 0.0f, 0.0f, 1.0f };

// Assign created components to GL_LIGHT0.
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
glLightfv(GL_LIGHT0, GL_POSITION, position);
Run Code Online (Sandbox Code Playgroud)

我认为照明在很大程度上起作用,但我的物体的颜色都消失了.我所看到的只是我整体身材的黑/白轮廓.

我想知道为什么会这样?

c++ opengl glut

26
推荐指数
2
解决办法
2万
查看次数

glGetShaderiv()中的'iv'代表什么?

什么是iv在结束glGetShaderiv()立场?

opengl

26
推荐指数
2
解决办法
2118
查看次数

如何在OpenGL FBO中使用多重采样

我正在尝试为FBO启用mutlisampling和alpha-to-coverage.使用默认的帧缓冲区,我所要做的就是调用glEnable(GL_MULTISAMPLE)glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE).但是,我无法使用自己的FBO达到同样的效果.

我的目标:将场景绘制到FBO,就像使用上述属性绘制到默认帧缓冲区一样.从那里我希望能够将图像用作未来通过着色器的纹理.

这适用:制作没有多重采样/ alpha到覆盖的FBO的代码,1种颜色附件,1种深度附件:

// Generate the color attachment
glGenTextures(1,&defaultColorAttachment0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,defaultColorAttachment0);
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_RGBA,screenWidth,screenHeight,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL);

// Bind the texture to the FBO
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, defaultColorAttachment0,0);

// Generate the depth attachment
glGenRenderbuffers(1,&defaultDepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, defaultDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, screenWidth, screenHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, defaultDepthBuffer);
Run Code Online (Sandbox Code Playgroud)

这不起作用.试图制作多重采样FBO的代码:

// Generate the color attachment
glGenTextures(1,&defaultColorAttachment0);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, defaultColorAttachment0);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA, screenWidth, screenHeight, GL_FALSE);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, defaultColorAttachment0,0);

// Generate the depth attachment
glGenRenderbuffers(1,&defaultDepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, defaultDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl fbo multisampling

26
推荐指数
1
解决办法
1万
查看次数

什么术语"genType"在OpenGL/GLSL中意味着什么?

在GLSL文档中,该术语genType通常用作参数类型.例如,该函数dot记录如下:

float dot(genType x,
          genType y);

double dot(genDType x,
           genDType y);
Run Code Online (Sandbox Code Playgroud)

这个词genType是什么意思?它的缩写是什么?它是否用于OpenGL之外的其他地方?

opengl graphics glsl

26
推荐指数
1
解决办法
8457
查看次数

使用专有的Nvidia驱动程序在Linux上出现多个OpenGLX渲染上下文失败

当我尝试在各个线程上运行超过128个当前OpenGLX渲染上下文时,调用glXMakeCurrent开始失败.

Display *display = XOpenDisplay(":0")
Window root_win = RootWindow(display, screen);
Window win = XCreateWindow (display, root_win, ...)
GLXContext context = glXCreateContext(display, visinfo, 0, True);

glXMakeCurrent(display, win, context); <---- Fails here on 128th
Run Code Online (Sandbox Code Playgroud)

此问题仅发生在专有的Nvidia驱动程序和Nvidia GPU上.我无法使用英特尔GPU重现.

复制代码glx.cpp:

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glx.h>
#include <GL/glxext.h>
#include <string.h>
#include <unistd.h>
#include <thread>
#include <vector>
#include <mutex>
#include <condition_variable>
#include <chrono>

#define MAX_CONTEXTS 200;

std::mutex mutex;
std::condition_variable cond;
bool will_stop = false;

int numSuccessfulContexts = 0;
#define EXIT_IF(condition, ...) if …
Run Code Online (Sandbox Code Playgroud)

c++ linux opengl nvidia glx

26
推荐指数
1
解决办法
885
查看次数

EGL和OpenGL之间有什么关系?

我正在写一个实现开放式VGOpenGL的| ES,这两者取决于Khronos的EGL API,据说是为了便于携带,我猜.

出于乐趣和教育原因,我正在OpenGL ES上编写一个OpenVG实现 - 我没有做过很多渲染工作,我想了解更多有关开放API和实践明确标准的实践(更容易看看我是否得到了正确的结果).

据我了解,EGL提供了一个标准API,用于检索绘图上下文(或者它正确调用的内容),而不是使用多个OS提供的API之一(GLX,WGL等)

在此输入图像描述

我很难相信Khronos会经历这样的努力并将标准OpenGL从循环中移开但事实是,我还没有发现OpenGL(真正的交易)如何或者是否与EGL接口或者它是否只是OpenGL ES.如果OpenGL ES可以使用EGL的绘图上下文,标准OpenGL是否也可以使用?

我对这一切都很陌生,这就是为什么我很兴奋,但我正在做的真正项目是一个Go小部件工具包,它利用OpenVG进行绘图操作,并尽可能使用硬件加速.

如果OpenVG,OpenGL和OpenGL ES依赖于EGL,我认为我的问题可以用"是"或"否"来回答.请记住,我昨晚首先进入了这个主题.

OpenGL使用或依赖于EGL吗?


关闭主题,但没有EGL标记.应该有吗?

opengl opengl-es openvg egl

25
推荐指数
3
解决办法
2万
查看次数

如何用零有效地初始化纹理?

我需要用零初始化OpenGL 2D纹理.

为什么?我用OpenCL渲染到这个纹理.粗略地说,渲染阶段是:

  1. 创建RGBA纹理,用零初始化(因此它包含透明的黑色像素)
  2. OpenCL:计算某些对象可见的像素颜色并将其写入此纹理
  3. OpenGL:将环境映射添加到透明像素并显示最终图像

因此,我不需要传递任何实际的纹理数据glTexImage2d.但根据规范,当我传递data = NULL时,纹理内存被分配但未初始化.

分配一个充满零和传递的客户端内存glTexImage2D不是一个很好的选择,虽然只有一个我能想到的.

编辑:我实际上只想初始化alpha组件(RGB无论如何都会被覆盖),但我怀疑这会使情况变得更容易.

opengl

25
推荐指数
2
解决办法
1万
查看次数

标签 统计

opengl ×10

c++ ×3

graphics ×2

directx ×1

egl ×1

fbo ×1

glsl ×1

glut ×1

glx ×1

linux ×1

macos ×1

multisampling ×1

multithreading ×1

nvidia ×1

opengl-es ×1

openvg ×1

sdl ×1