标签: opengl

OpenGL低级性能问题

与任何优化问题一样,这个主题受到很多打击,但我找不到我想的东西.

很多教程,甚至SO问题都有类似的提示; 一般涵盖:

  • 使用GL面部剔除(OpenGL功能,而不是场景逻辑)
  • 仅向GPU发送1个矩阵(projectionModelView组合),因此将每个顶点的MVP计算减少到每个模型一次(应该如此).
  • 使用交错顶点
  • 最小化尽可能多的GL调用,在适当的情况下进行批处理

可能还有一些/很多其他人.我(出于好奇的原因)在我的应用程序中使用几个顶点缓冲区渲染2800万个三角形.我已经尝试了所有上述技术(据我所知),几乎没有性能变化.

虽然我在实施中收到大约40FPS,这绝不是问题,但我仍然很好奇这些优化'技巧'实际上在哪里使用?

我的CPU在渲染过程中空闲了大约20-50%,因此我认为我是GPU必须提高性能.

注意:我现在正在研究gDEBugger

Cross在Game Development上发布

opengl optimization performance sdl opengl-3

19
推荐指数
1
解决办法
5270
查看次数

有没有办法在多GPU环境中以编程方式选择渲染GPU?(视窗)

我有一个OpenGL应用程序,可以在具有多种多GPU配置的机器上运行(可能还有不同的Windows版本,从XP到7).是否有一般方法可以选择独立于GPU组合的OpenGL渲染器的特定GPU(例如NVIDIA + NVIDIA,NVIDIA + AMD,NVIDIA + Intel等)?它必须是可以从应用程序代码应用的解决方案,即直接在C++或将从应用程序调用的脚本,而无需最终用户干预.

以下是我尝试寻找解决方案的几项测试的详细信息,从非常具体的案例开始,但也许有一个解决方案可以在所有或大多数情况下工作.

是否有任何可靠的方法来强制哪些GPU进行OpenGL渲染?

任何提示都将非常感激.提前致谢!

试过可能的解决方案

Windows XP 64带有两个NVIDIA Quadro

使用两个Quadro卡组合进行测试

  • Quadro FX 1700 + Quadro FX 570
  • Quadro FX 1700 + Quadro FX 540
  • Quadro FX 1700 + Quadro NVS 285

在Windows XP 64位下使用相同的驱动程序(版本275.36),我在各种方法上取得了相对成功,例如:

  • 让司机决定.
    只要两张卡使用相同的驱动程序并决定使用所需的卡,此解决方案就是好的.所以它太具体,可能无法预测.

  • 在让司机决定之前,使用NVAPI更改代码中的驱动程序设置.
    有了这个解决方案,理论上可以让驱动程序按我的意愿决定,但很难,需要两张卡使用相同的驱动程序而且并不总是有效(使用FX 1700 + NVS 285它不起作用).

  • 更改主屏幕.
    这具有默认情况下应用程序在所选主屏幕中打开的效果.该解决方案仅与FX 1700 + FX 570组合一起使用.使用FX 1700 + FX 540,渲染器取决于驱动程序设置,独立于主屏幕,而FX 1700 + NVS 285渲染器始终为FX 1700.

  • 当窗口在特定屏幕中时创建OpenGL上下文.
    窗口可以在所需的屏幕中创建,独立于主屏幕,但它具有与上述解决方案相同的问题.

  • 创建OpenGL上下文,仅启用所需图形卡中的屏幕,然后启用其他/ s.
    这是我发现使用NVS 285作为渲染器的唯一方法,但它很难看,我不知道它是否可自动化,或者它是否适用于所有情况.

  • 尝试使用WGL_NV_gpu_affinity扩展名选择渲染GPU .
    通过FX 1700和FX 570的组合,扩展程序将两个GPU报告为兼容,并且我可以将渲染仅限制为其中一个.使用FX 1700 …

windows opengl multiple-monitors multi-gpu

19
推荐指数
1
解决办法
4118
查看次数

NULL + int的结果是什么?

我在OpenGL VBO实现中看到了以下宏:

#define BUFFER_OFFSET(i) ((char *)NULL + (i))
//...
glNormalPointer(GL_FLOAT, 32, BUFFER_OFFSET(x));
Run Code Online (Sandbox Code Playgroud)

你能提供一下这个宏的工作原理吗?可以用功能替换吗?更确切地说,递增NULL指针的结果是什么?

c opengl null pointers pointer-arithmetic

19
推荐指数
2
解决办法
5021
查看次数

在单个OpenGL程序中附加多个相同类型的着色器?

在阅读OpenGL规范时,我注意到它提到你可以在一个程序中包含多个相同类型的着色器(即多个GL_VERTEX_SHADER附带glAttachShader).特别是在OpenGL 4.2,§2.11.3,程序对象:"相同类型的多个着色器对象可以附加到单个程序对象......".

OpenGL管道程序和子程序可能适用于此处,但这是在存在之前定义的(事实上它可以追溯到2.1规范,§2.15.2),所以我正在寻找这个想法的前GL4示例.当我做一些简单的测试时,我发现包含多个void main()导致链接错误.有人知道一个使用它的实际例子吗?

opengl

19
推荐指数
2
解决办法
6739
查看次数

glCreateShader正在崩溃

我应该有Glew和Glut的最新版本,所以不应该是问题.一切都应该链接,我正在使用MS visual studio 2010.我的程序编译但是当我到glCreateShader(GL_FRAGMENT_SHADER)它显示错误:"0xC0000005:访问冲突."

我的节目:

#include <GL\glew.h>
#include <GL\glut.h>
#include <stdio.h>
#include <stdlib.h>

GLuint program;

static char* readShaderSource(const char * shaderFile)
{
    FILE* fp = fopen(shaderFile, "r");
    char* buf;
    long size;

    if (fp == NULL) return NULL; 
    fseek(fp, 0L, SEEK_END);//go to end
    size = ftell(fp);       //get size
    fseek(fp, 0L, SEEK_SET);//go to begining

    buf = (char*) malloc((size +1) * sizeof(char));
    fread(buf, 1, size, fp);
    buf[size] = NULL;
    fclose(fp);
    return buf;
}

static void initShader(const GLchar * fsFile)
{
    GLint status;
    GLchar …
Run Code Online (Sandbox Code Playgroud)

c opengl graphics glut glew

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

如何让GHCi在GHC 7.6.1 x86-64 Windows 7下加载opengl包?

我可以使用GHC成功构建与OpenGL链接的可执行文件,但是我无法将软件包加载到GHCi中.这绝对是我的回归,因为它适用于32位GHC(至少我升级的版本).我不认为GHC版本很重要,只是因为我使用的是64位GHC系统.

根据维护者的建议,我明确地将正确的64位版本的opengl32成功引入了GHCi.这似乎是一个更高的问题.

这是相关的输出.不幸的是,详细输出同样具体.函数wglGetProcAddress用于查找opell api挂钩在dll中的位置.

$ ghcii.sh  -package OpenGL   
GHCi, version 7.6.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package OpenGLRaw-1.2.0.0 ... linking ... ghc.exe: unable to load package `OpenGLRaw-1.2.0.0'
ghc.exe: C:\...\cabal\OpenGLRaw-1.2.0.0\ghc-7.6.1\HSOpenGLRaw-1.2.0.0.o: unknown symbol `__imp_wglGetProcAddress'
Run Code Online (Sandbox Code Playgroud)

opengl haskell ghci

19
推荐指数
0
解决办法
574
查看次数

为什么GL将'gl_Position`除以W而不是让你自己做?

注意:我理解基本的数学.我理解perspective各种数学库中的典型函数会产生一个矩阵,它将-zNear到-zFar的z值转换回-1到+1,但前提是结果除以w

具体的问题是GPU为你做了什么,而不是你必须自己做?

换句话说,可以说的GPU没有神奇划分gl_Positiongl_Position.w,并且代替你不得不做手工,如

attribute vec4 position;
uniform mat4 worldViewProjection;

void main() {
  gl_Position = worldViewProjection * position;

  // imaginary version of GL where we must divide by W ourselves
  gl_Position /= gl_Position.w;
}
Run Code Online (Sandbox Code Playgroud)

由于这个原因,这个想象中的GL会打破什么?它是否有效或是否有一些关于在被除以之前传递值的东西,它w为GPU提供了额外需要的信息?

请注意,如果我实际执行此操作,纹理映射透视图会中断.

"use strict";
var m4 = twgl.m4;
var gl = twgl.getWebGLContext(document.getElementById("c"));
var programInfo = twgl.createProgramInfo(gl, ["vs", "fs"]);

var bufferInfo = twgl.primitives.createCubeBufferInfo(gl, 2);

var tex = twgl.createTexture(gl, {
  min: gl.NEAREST,
  mag: gl.NEAREST,
  src: [
    255, 255, 255, 255, …
Run Code Online (Sandbox Code Playgroud)

opengl opengl-es glsl

19
推荐指数
2
解决办法
3254
查看次数

NameError:名称“glPushMatrix”未定义

尝试运行稳定基线健身房的测试代码

import gym

from stable_baselines3 import A2C

env = gym.make("CartPole-v1")

model = A2C("MlpPolicy", env, verbose=1)
model.learn(total_timesteps=10_000)

obs = env.reset()
for i in range(100):
    action, _state = model.predict(obs, deterministic=True)
    obs, reward, done, info = env.step(action)
    env.render()
    if done:
      obs = env.reset()
Run Code Online (Sandbox Code Playgroud)

发现错误“NameError:名称'glPushMatrix'未定义”

Traceback (most recent call last):
  File "test_cart_pole.py", line 14, in <module>
    env.render()
  File "/Users/xxx/opt/anaconda3/lib/python3.8/site-packages/gym/core.py", line 295, in render
    return self.env.render(mode, **kwargs)
  File "/Users/xxx/opt/anaconda3/lib/python3.8/site-packages/gym/envs/classic_control/cartpole.py", line 229, in render
    return self.viewer.render(return_rgb_array=mode == "rgb_array")
  File "/Users/xxx/opt/anaconda3/lib/python3.8/site-packages/gym/envs/classic_control/rendering.py", line 126, in render
    self.transform.enable()
  File …
Run Code Online (Sandbox Code Playgroud)

python opengl render

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

OpenGL的LookAt函数中的UP向量究竟是什么?

这与LookAt目标位置无关,如果它是z = 0或z = 1000或-1000?

我试过了

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.0f, 1.0f, 0.0f);
Run Code Online (Sandbox Code Playgroud)

并且工作正常,现在我将第3行(UP向量),最后一个数字更改为0.8:

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.0f, 1.0f, 0.8f);
Run Code Online (Sandbox Code Playgroud)

它完全相同...接下来我尝试并修改了第3行,第一个数字为0.8:

    gluLookAt(512, 384, 2000,
              512, 384, 0,
              0.8f, 1.0f, 0.8f);
Run Code Online (Sandbox Code Playgroud)

现在视图就像向左旋转了45度.这个UP向量如何工作?

opengl glulookat

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

游戏开发中的世界空间和眼睛空间是什么?

我正在读一本关于3D概念和OpenGL的书.这本书总是讲述世界空间,眼睛空间等等.

  • 电脑显示器屏幕内究竟是什么世界

  • 什么是世界空间?

  • 什么是眼睛空间?它是投影的同义词吗?

opengl 3d game-engine

18
推荐指数
1
解决办法
3230
查看次数