2016-11-07 28 views
1

テクスチャユニットの制限を超えた後、キューブマップの配列テクスチャを使用することに決めました。OpenGL - キューブマップ配列の作成とバインド方法

テストの目的で、キューマップの内容をスカイボックスとしてレンダリングします。つまり、OpenGLはキューブマップ配列をバインドするときを無視し、以前にバインドされたキューブマップを使用してskyboxをレンダリングします。

GL.BindTexture(TextureTarget.TextureCubeMap, shadowMaps[5].cubeMapTexture); 
GL.BindTexture(TextureTarget.TextureCubeMapArray, shadowMapArray.cubeMapHandle); // Ignored 

誤って作成されたキューブマップ配列のデフォルト動作であるとします。私が知る限り、私はすべてを正しく行った:Framebuffer complete

したがって、キューブマップ配列を作成してバインドする正しい方法は何ですか?

public class CubeMapArray 
{ 
    public static int size = 512; 
    public static int layers = 8; // number of cube maps in array 

    public int FBO_handle; 
    public int cubeMapHandle; 
    public int cubeMapDepthHandle; 

    // Constructor // 
    public CubeMapArray() 
    { 
     // Create the FBO 
     GL.GenFramebuffers(1, out FBO_handle); 

     // Create and bind the CubeMap array 
     GL.GenTextures(1, out cubeMapHandle); 
     GL.BindTexture(TextureTarget.TextureCubeMapArray, cubeMapHandle); 

     // Allocate storage space 
     GL.TexImage3D(TextureTarget.TextureCubeMapArray, 0, PixelInternalFormat.Rg16, size, size, layers * 6, 0, PixelFormat.Red, PixelType.Float, IntPtr.Zero); 

     // Set the suitable texture parameters 
     GL.TexParameter(TextureTarget.TextureCubeMapArray, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); 
     GL.TexParameter(TextureTarget.TextureCubeMapArray, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); 
     GL.TexParameter(TextureTarget.TextureCubeMapArray, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge); 
     GL.TexParameter(TextureTarget.TextureCubeMapArray, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge); 
     GL.TexParameter(TextureTarget.TextureCubeMapArray, TextureParameterName.TextureWrapR, (int)TextureWrapMode.ClampToEdge); 
     GL.TexParameter(TextureTarget.TextureCubeMapArray, TextureParameterName.TextureBaseLevel, 0); 
     GL.TexParameter(TextureTarget.TextureCubeMapArray, TextureParameterName.TextureMaxLevel, 0); 

     // Create and bind the CubeMap depth array 
     GL.GenTextures(1, out cubeMapDepthHandle); 
     GL.BindTexture(TextureTarget.TextureCubeMapArray, cubeMapDepthHandle); 

     // Allocate storage space 
     GL.TexImage3D(TextureTarget.TextureCubeMapArray, 0, PixelInternalFormat.DepthComponent, size, size, layers * 6, 0, PixelFormat.DepthComponent, PixelType.UnsignedByte, IntPtr.Zero); 

     // Set the suitable texture parameters 
     GL.TexParameter(TextureTarget.TextureCubeMapArray, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); 
     GL.TexParameter(TextureTarget.TextureCubeMapArray, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); 
     GL.TexParameter(TextureTarget.TextureCubeMapArray, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge); 
     GL.TexParameter(TextureTarget.TextureCubeMapArray, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge); 
     GL.TexParameter(TextureTarget.TextureCubeMapArray, TextureParameterName.TextureWrapR, (int)TextureWrapMode.ClampToEdge); 
     GL.TexParameter(TextureTarget.TextureCubeMapArray, TextureParameterName.TextureBaseLevel, 0); 
     GL.TexParameter(TextureTarget.TextureCubeMapArray, TextureParameterName.TextureMaxLevel, 0); 

     // Attach cubemap texture as the FBO's color buffer 
     GL.BindFramebuffer(FramebufferTarget.Framebuffer, FBO_handle); 
     GL.FramebufferTexture(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, cubeMapHandle, 0); 
     GL.FramebufferTexture(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, cubeMapDepthHandle, 0); 

     // Error check 
     var errorcheck = GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer); 
     Console.WriteLine("CUBEMAP ARRAY: " + errorcheck); 

     // Bind default framebuffer 
     GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); 
    } 
} 

}

シェーダは十分に単純であり、驚くべきことには、通常のキューブマップを結合働きます。

頂点

#version 330 

in vec3 texCoord; 
out vec4 fragColor; 
uniform samplerCube cubeMapArray[16]; 

void main (void) 
{ 
    fragColor = texture(cubeMapArray[0], texCoord); 
} 

断片

#version 330 

uniform mat4 modelMatrix; 
uniform mat4 viewMatrix; 
uniform mat4 projectionMatrix; 

in vec3 in_position; 
out vec3 texCoord; 

void main() 
{ 
    gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_position, 1.0); 
    texCoord = in_position; 
} 

答えて

3

あなたのシェーダコードに対応したサンプラータイプを使用する必要があります。キューブマップ配列はOpenGL 4.0以降で使用できるため、GLSLのバージョンを400以降にする必要があります。

シェーダコードは、これらの線に沿って何かを見ますサンプリングの配列層はテクスチャ座標の第4成分として指定されていることを

#version 400 
... 
uniform samplerCubeArray cubeMapArray; 
... 
fragColor = texture(cubeMapArray, vec4(texCoord, 0)); 

注意。

+0

samplerCubeArray!とてもシンプルなので、ありがとう。 –

3
uniform samplerCube cubeMapArray[16]; 

OK、array of samplersarray texture差があります。ここにはサンプラーの配列があります。あなたがをOpenGLで作成したは配列テクスチャでした。

配列テクスチャは、アレイでない配列のseparate texture typesです。キューブマップ配列テクスチャはキューブマップテクスチャではありません。キューブマップの配列テクスチャです。 2D配列テクスチャのように、2Dテクスチャではありません。

アレイテクスチャが必要な場合は、適切なサンプラタイプを使用する必要があります。これはキューブマップの配列テクスチャなので、samplerCubeArrayを使用します。そして配列の添え字を取り除かなければなりません。

キューブマップ配列のテクスチャからサンプリングする場合、第四成分が、あなたからサンプリングしたいアレイ層である:

また
fragColor = texture(cubeMapArray, vec4(texCoord, 0)); 

、あなたはキューブマップ配列のテクスチャを使用する場合は、非結合しません - アレイキューブマップテクスチャすべて。それは違法ではありません。それはちょうど混乱し、最高の回避されます。

+0

最初にレトーが答えてくれたので、もう一度感謝します。前のキューブマップ配列テクスチャがバインドされているかどうかを調べるために、配列以外のキューブマップテクスチャをバインドしていました。 –

関連する問題