我正在创建类似于CUDA的东西,但我看到从RAM到VRAM的复制内存非常快,就像从RAM复制到自身一样.但是从VRAM复制到RAM比RAM到VRAM要慢.
顺便说一句,我glTexSubImage2D用来从RAM复制到VRAM并glGetTexImage从VRAM复制到RAM.
为什么?有没有办法提高它的性能,如将RAM复制到VRAM?
有没有办法在缓冲区对象上运行着色器并使用着色器使用其他一些数据修改它?
换句话说:有没有办法在着色器中创建统一的全局变量并且可以修改?
我试过了:
#version 130
uniform sampler2D texID;
in vec2 texcoord;
out vec4 outcolor;
void main(void) {
vec2 tcoord=texcoord.xy*768.0;
ivec2 tst=ivec2(tcoord.x,tcoord.y);
outcolor=texelFetch(texID,tcoord);
}
Run Code Online (Sandbox Code Playgroud)
并得到了错误texelFetch:
无法找到兼容的重载函数"texelFetch(sampler2D,vec2)".
我没有把这些参数放在我的头上,这里有几个来源:
TheQuestion:有没有办法使用的方式GL_TEXTURE_2D与texelFetch或纹理着色器执行时只是直接读取的像素?
我怎么能告诉编译器如何优化某些东西或某些调用函数.我的意思是像创建分配方法,让编译器优化它,因为它用malloc或优化它new.
或者,如果代码中的某个地方调用了函数X并且未使用它的返回值,则删除此调用.(来自.lib的函数,编译器不知道它的一部分)
有这个选项吗?
例如:
auto val=X(); //Use the return value
X(); //Don't use
auto t=allocate<T>(); //Allocate on heap
t->Show(val); //Run single function and don't use it's pointer somewhere (Save it after the function is exit)
Run Code Online (Sandbox Code Playgroud)
并优化它:
X(); //First line, just call it
T().Show(val); //Combines third and fourth lines, Allocate on stack and run the single function
Run Code Online (Sandbox Code Playgroud)
如果你问'你为什么需要这个?' 我用自己的GC和堆创建编程语言.(还有很多东西)
它转换为C++然后我不想在翻译时优化代码.(这将是一种痛苦)因为我可以在某些地方随机调用函数.(我无法检测他们的值是否被使用)
我检查了一些内容,得到了关于 C++ & OpenGL & GLSL 性能的奇怪结果。
在第一个程序中,我使用片段着色器将像素绘制到纹理,然后渲染纹理。纹理的 mag\min 为GL_NEAREST。
在第二个程序中,我使用片段着色器并直接渲染到屏幕上。
为什么第二个程序更快?渲染纹理不是比重复相同的动作更快吗?
这就像拍摄 AAA 游戏的视频,然后在同一台计算机上显示它,并随着视频获得较低的 FPS。
片段着色器是:
uniform int mx,my;
void main(void) {
vec2 p=gl_FragCoord.xy;
p-=vec2(mx,my);
if (p.x<0.0)
p.x=-p.x;
if (p.y<0.0)
p.y=-p.y;
float dis=sqrt(p.x*p.x+p.y*p.y);
dis+=(abs(p.x)+abs(p.y))-(abs(p.x)-abs(p.y));
p.x/=dis;
p.y/=dis;
gl_FragColor=vec4(p.x,p.y,0.0,1.0);
}
Run Code Online (Sandbox Code Playgroud)