簡體   English   中英

OpenGL Texture3D FragmentShader寫入圖層

[英]OpenGL Texture3D FragmentShader Write Into Layers

我想過濾紋理(沒有mipmapping)並將過濾后的級別寫入3D紋理。 我已經用以下代碼創建了一個3D紋理:

glGenTextures(1, &outTexture);
glBindTexture(GL_TEXTURE_3D, outTexture);
glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, width, height, layer, 0, GL_RGBA, GL_INT, 0);
glBindTexture(GL_TEXTURE_3D, 0);

我像這樣渲染我的模型:

glFramebufferTexture3D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_3D, outTexture, 0, layer);
entity.render();

片段着色器是否有辦法同時寫入多個圖層並知道您在哪個層? 像這樣?

out_color[layer] = vec4(r,g,b,a);

PS:我需要知道片段着色器中的哪一層(有些過濾事物請不要gl_Layer ...只能在OpenGL 4中使用,我只能使用OpenGL 3)...我可以把它寫成制服渲染多次,但如果有一個方法去一次通過...這將是很好的:)

片段着色器的實例無法選擇要寫入的層。 這是由幾何着色器為其選擇的,該幾何着色器構造了生成相關片段的基元。 因此,如果要渲染到多個圖層,則需要使用分層渲染和GS

如果Fragment Shader需要知道它要寫入的圖層,那么讓Geometry Shader將其作為每頂點參數傳遞:

//Geometry shader
flat out int layerIndex;

void main()
{
  for(int currLayer = 0; currLayer < numLayers; ++currLayer)
  {
    for(int currVertex = 0; currVertex < gl_in.length(); ++currVertex)
    {
      layerIndex = currLayer;
      gl_Layer = currLayer;
      //Compute other per-vertex outputs
      EmitVertex();
    }
    EndPrimitive();
  }
  EmitVertex();
}

//Fragment shader
flat in int layerIndex;

void main()
{
  //Do stuff with layerIndex;
}

暫無
暫無

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

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