与任何优化问题一样,这个主题受到很多打击,但我找不到我想的东西.
很多教程,甚至SO问题都有类似的提示; 一般涵盖:
可能还有一些/很多其他人.我(出于好奇的原因)在我的应用程序中使用几个顶点缓冲区渲染2800万个三角形.我已经尝试了所有上述技术(据我所知),几乎没有性能变化.
虽然我在实施中收到大约40FPS,这绝不是问题,但我仍然很好奇这些优化'技巧'实际上在哪里使用?
我的CPU在渲染过程中空闲了大约20-50%,因此我认为我是GPU必须提高性能.
注意:我现在正在研究gDEBugger
Cross在Game Development上发布
我有一个OpenGL应用程序,可以在具有多种多GPU配置的机器上运行(可能还有不同的Windows版本,从XP到7).是否有一般方法可以选择独立于GPU组合的OpenGL渲染器的特定GPU(例如NVIDIA + NVIDIA,NVIDIA + AMD,NVIDIA + Intel等)?它必须是可以从应用程序代码应用的解决方案,即直接在C++或将从应用程序调用的脚本,而无需最终用户干预.
以下是我尝试寻找解决方案的几项测试的详细信息,从非常具体的案例开始,但也许有一个解决方案可以在所有或大多数情况下工作.
是否有任何可靠的方法来强制哪些GPU进行OpenGL渲染?
任何提示都将非常感激.提前致谢!
使用两个Quadro卡组合进行测试
在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 …
我在OpenGL VBO实现中看到了以下宏:
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
//...
glNormalPointer(GL_FLOAT, 32, BUFFER_OFFSET(x));
Run Code Online (Sandbox Code Playgroud)
你能提供一下这个宏的工作原理吗?可以用功能替换吗?更确切地说,递增NULL指针的结果是什么?
在阅读OpenGL规范时,我注意到它提到你可以在一个程序中包含多个相同类型的着色器(即多个GL_VERTEX_SHADER附带glAttachShader).特别是在OpenGL 4.2,§2.11.3,程序对象:"相同类型的多个着色器对象可以附加到单个程序对象......".
OpenGL管道程序和子程序可能适用于此处,但这是在存在之前定义的(事实上它可以追溯到2.1规范,§2.15.2),所以我正在寻找这个想法的前GL4示例.当我做一些简单的测试时,我发现包含多个void main()导致链接错误.有人知道一个使用它的实际例子吗?
我应该有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) 我可以使用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) 注意:我理解基本的数学.我理解perspective各种数学库中的典型函数会产生一个矩阵,它将-zNear到-zFar的z值转换回-1到+1,但前提是结果除以w
具体的问题是GPU为你做了什么,而不是你必须自己做?
换句话说,可以说的GPU没有神奇划分gl_Position的gl_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)尝试运行稳定基线健身房的测试代码
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) 这与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向量如何工作?
我正在读一本关于3D概念和OpenGL的书.这本书总是讲述世界空间,眼睛空间等等.
电脑显示器屏幕内究竟是什么世界?
什么是世界空间?
什么是眼睛空间?它是投影的同义词吗?