滚动程序生成的纹理的tex坐标时出现奇怪的闪烁



程序生成的纹理看起来很好,直到我开始尝试使用GL_REPEAT滚动纹理坐标。如果我只滚动我上传的普通图像,那么它滚动正常。但是程序性的人会做这种奇怪的,周期性的闪烁效果。我正在尝试生成一个星空,所以它只是透明背景上的白点,有了这个问题,星星逐渐淡化到几乎黑色,然后又变回白色,依此类推。此外,如果我生成了大量的恒星,则有一些星星没有表现出这种行为,但看起来很正常。

在这里,我只是设置OpenGL的纹理并建立像素数组。

glBindTexture(GL_TEXTURE_2D,tex_id);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
GLubyte *pixels=new GLubyte[(screen_width)*(screen_height)*4];

在这里,我设置了随机数生成器,并为我想要的星数填写像素数据。

irngX=new IRNG(0,screen_width-1);
irngY=new IRNG(0,screen_height-1);
for (int i=0; i<count; ++i){
int x=irngX->get();
int y=irngY->get();
int pos=(y*screen_width*4)+(x*4);
pixels[pos++]=(GLubyte)255;
pixels[pos++]=(GLubyte)255;
pixels[pos++]=(GLubyte)255;
pixels[pos++]=(GLubyte)255;
}

在这里,我将像素上传到OpenGL...像素存储功能似乎对任何事情都没有影响,不像桌面OpenGL,反正我也不了解它的用法。我断断续续地试过了。

glPixelStorei(GL_UNPACK_ALIGNMENT,1); // ?? 
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,screen_width,screen_height,0,
GL_RGBA,GL_UNSIGNED_BYTE,pixels);
glPixelStorei(GL_UNPACK_ALIGNMENT,4);

这是我的德克萨斯坐标滚动条:

tex_scroller+=0.001f;
glUniform1f(tex_scroller_loc,tex_scroller);

在着色器中:

vtex.t+=tex_scroller;

我希望这就是所有相关的代码,并且我已经使我的问题可以理解。 如果您需要更好的描述,请告诉我。 附言如果我的代码格式不正确,我会阿波洛齐。我试过了。

问题可能与纹理采样有关。你的星星只是单个纹素的大小,当你滚动时,屏幕像素的网格不再与纹素的网格完全对齐,所以纹理过滤正在发生(GL_LINEAR(,这会影响亮度。这尤其是一个问题,因为您的透明纹素可能是黑色的。一些建议:

  • 尝试在上面的代码中将"GL_LINEAR"更改为"GL_NEAREST"。这应该可以修复任何褪色,但可能会用开/关闪烁代替它。
  • 尝试使透明的纹素变白,这将改善事情。
  • 尝试将tex_scroller+=0.001f;更改为tex_scroller+=1.0f/screen_width;,看看是否可以使纹素网格和像素网格对齐
  • 尝试将星星的大小更改为多个纹素,而不是单个纹素。

最新更新