我想根据它们在世界上的xyz位置来调整颜色.
我在片段着色器中试过这个:
varying vec4 verpos;
void main(){
vec4 c;
c.x = verpos.x;
c.y = verpos.y;
c.z = verpos.z;
c.w = 1.0;
gl_FragColor = c;
}
Run Code Online (Sandbox Code Playgroud)
但似乎颜色根据我的相机角度/位置而变化,我如何使坐标独立于我的相机位置/角度?
继承人我的顶点着色器:
varying vec4 verpos;
void main(){
gl_Position = ftransform();
verpos = gl_ModelViewMatrix*gl_Vertex;
}
Run Code Online (Sandbox Code Playgroud)
Edit2:改变标题,所以我想要世界坐标,而不是屏幕坐标!
Edit3:添加了我的完整代码
我正在尝试从函数参数返回数据指针:
bool dosomething(char *data){
int datasize = 100;
data = (char *)malloc(datasize);
// here data address = 10968998
return 1;
}
Run Code Online (Sandbox Code Playgroud)
但是当我按以下方式调用函数时,数据地址变为零:
char *data = NULL;
if(dosomething(data)){
// here data address = 0 ! (should be 10968998)
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我找到了一些像这样"优化"的代码:
void somefunc(SomeStruct param){
float x = param.x; // param.x and x are both floats. supposedly this makes it faster access
float y = param.y;
float z = param.z;
}
Run Code Online (Sandbox Code Playgroud)
并且评论说它会使变量访问速度更快,但我一直认为结构元素访问速度和它毕竟不是结构一样快.
有人能清除我的头脑吗?
我有一个二进制文件,我想直接嵌入到我的源代码中,因此它将直接编译到.exe文件中,而不是从文件中读取它,所以当我启动程序时数据已经在内存中.
我该怎么做呢?
我得到的唯一想法是将我的二进制数据编码为base64,将其放入字符串变量然后将其解码回原始二进制数据,但这是一种棘手的方法,会导致无意义的内存分配.此外,我想将.exe中的数据存储为原始数据的紧凑.
编辑:我之所以使用base64的原因是因为我想让源代码文件尽可能小.
目前我只是这样做:
someuniform1 = glGetUniformLocation(MyShaderName, "someuniform1");
someattribute1 = glGetAttribLocation(MyShaderName, "someattribute1");
Run Code Online (Sandbox Code Playgroud)
但是这个方法看起来很烦人,所以我想使用std :: map:
Shaders[MyShaderName].Uniforms["someuniform1"] = glGetUniformLocation(MyShaderName, "someuniform1");
Shaders[MyShaderName].Attributes["someattribute1"] = glGetAttribLocation(MyShaderName, "someattribute1");
// i could add a function to remove the repetition of the two strings at both sides.
Run Code Online (Sandbox Code Playgroud)
有没有更明智/更快的方法呢?(尽可能减少重复).
-
编辑:我正在考虑更多关于这个想法,我想,如果我只是阅读glsl源文件,解析统一/属性并自动设置到我的地图,这不是很好,我不需要写除glsl源之外的任何内容!?这是大男孩们这样做的吗?
Edit2:我现在正在成功解析GLSL着色器文件,并且使用该std::map方法,我使用单个函数调用和一个字符串参数来获取当前启用的着色器中的制服/属性的地址.如果我需要更多性能,我将缓存std::map对其他变量的调用.但我想知道我是否在这里正确的轨道...所以请,任何评论赞赏.
我想控制声源音量如何逐渐淡出的方式,我该怎么做?
编辑:我也想知道如何相应地缩放声音坐标系:我不想听到远离声源的声音:现在我将不得不改变我的渲染代码以缩放坐标以使其按我想要的方式工作.
编辑2:虽然,一个解决方案可能是在我发送它们之前乘以我的坐标......但是有更优雅的方法吗?
我可以只用一个三角形渲染三角形渐变,并为每个角使用glColor.
但如何渲染完美的矩形渐变?我尝试了一个四边形,但中间会变得难看.我也尝试过2x2尺寸的纹理,就像它应该做的那样:从每个角落进行适当的混合,但是当拉伸太多时纹理采样精度变得不准确(我开始看到大于1x1尺寸的像素).
有没有办法在着色器中计算这个?
-
编辑:这是问题所在:
我之前使用过SDL_Mixer,它可以正确地完成这项工作:当我按顺序播放一个单一函数调用一个声音时,所有声音都会混合在一起.但是在OpenAL中,当我用alSourcePlay()播放声音时,它只播放一个声音,而不会混合到之前的声音中.
那么,我怎么能同时播放超过1个声音呢?
我一直在考虑这个问题,如果我切换巨大的纹理,而不是用glBindTexture()切换许多稍微小一些的纹理,它是否会使渲染速度变慢?我有这样的想法,每次使用glBindTexture()时,GPU都会将纹理数据复制到更快的内存位置,所以我认为大纹理也需要更长时间才能复制.
但是,我记得以前使用许多小纹理来创建动画,而且在某些gfx卡上它非常慢,但是当我将动画帧放在单个纹理上时,性能却高得惊人.不过,在这两种情况下,我在其他一些gfx卡上都没有性能问题.
那就是说,我应该总是使用最大可能的纹理表面尺寸吗?(如果我不浪费那么多的空纹理空间.)
我确定我以前在学校有这个,但我不记得这个叫做什么.
我有任意数字,我需要知道我可以将它乘以0.9(或任何其他值0-1)多少次,直到距离原始数字小于x.
它采用循环格式,如下所示:
num = 4654;
mult = 0.9;
limit = 140;
count = 0;
while(num >= limit){
num *= mult;
count++;
}
Run Code Online (Sandbox Code Playgroud)
但这是否可以在没有循环的情况下完成?有对数的东西?