簡體   English   中英

為什么mipmapping在我的3D紋理上不起作用? (opengl)

[英]Why does mipmapping not work on my 3D texture? (opengl)

因此,我要創建一個地形並進行紋理處理,我想使用一個3D紋理(深度3),該紋理在每個z層上都可以容納3張圖像(512x512),這樣我就可以基於一個因數:0/3 =圖像1,1/3 =圖像2,2/3 =圖像3,並且之間的每個值都與下一級進行插值(循環)。

只要我不在此3D紋理上啟用Mip貼圖,此方法就可以完美地工作。 當我啟用它時,除非我靠近,否則我的地形將始終獲得相同的一幅圖像,就好像圖像已從z層轉換為mip地圖層一樣。

我不明白,有人可以告訴我我做錯了什么嗎?

這是我生成紋理的地方:

glGenTextures(1, &m_textureId);
glBindTexture(GL_TEXTURE_3D, m_textureId);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 512, 512, 3, 0, GL_BGR, GL_UNSIGNED_BYTE, 0);

這是我為每個Z執行的步驟:

glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, Z, 512, 512, 1, GL_BGR, GL_UNSIGNED_BYTE, imageData);

之后,我要做:

glGenerateMipmap(GL_TEXTURE_3D);

在着色器中,我將紋理定義為:

uniform sampler3D tGround;

並簡單地用以下方法采樣:

texture(tGround, vec3(texcoord, f));

其中texcoord是2D坐標,而f是我們需要的圖層,僅基於當前高度。

有一種方法可以執行您想要的操作,但這確實需要工作。 而且,您不能使用3D紋理來做到這一點。

您必須改為使用陣列紋理 想到2D陣列紋理的通常方法是將一堆相同大小的2D紋理打包。 但您也可以將其視為3D紋理,其中每個mipmap級別具有相同數量的Z層。 但是,還存在數組層之間沒有混合的問題。

由於要混合,因此需要對其進行合成。 但這對於着色器很簡單:

vec4 ArrayTextureBlend(in vec3 texCoord)
{
  float frac = fract(texCoord.z);
  texCoord.z = floor(texCoord.z);
  vec4 top = texture(arrayTex, texCoord);
  vec4 bottom = texture(arrayTex, texCoord + vec3(0, 0, 1));
  return mix(top, bottom, frac); //Linearly interpolate top and bottom.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM