开发者

Unexplainable behavior when using uniform sampler2d[]

I'm sorry but this will require a little bit of explanation. I'm trying to make it as simple as possible.

What I want to do: I'm visualizing height fields. A height field may have multiple patches. A patch is a smaller texture that alters the height field.

I'm using OpenGL 4.0, mainly the tesselation shaders. However for this problem this should be irrelevant.

What is working allready. I have the visualisation for the height field (without patches) working. The interessing parts in regard to the problem are the tesselation evaluation shader and the fragment shader.

The tesselation evaluation shader fetches for each vertex its height from the height field sampler.

layout(quads, fractional_odd_spacing, ccw) in;

out float onEdge;
out float teDistanceToMinHeight;
out vec4 tcPosition;

void main()
{
    // bilinear interpolate: position
    vec4 pos_a    = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);
    vec4 pos_b    = mix(gl_in[3].gl_Position, gl_in[2].gl_Position, gl_TessCoord.x);
    vec4 position = mix(pos_a, pos_b, gl_TessCoord.y);

    // bilinear interpolate: hf texture coordinate
    vec2 tex_a    = mix(gl_in[0].gl_TexCoord[HFTexCoordID].xy, gl_in[1].gl_TexCoord[HFTexCoordID].xy, gl_TessCoord.x);
    vec2 tex_b    = mix(gl_in[3].gl_TexCoord[HFTexCoordID].xy, gl_in[2].gl_TexCoord[HFTexCoordID].xy, gl_TessCoord.x);
    vec2 hfTexCoord = mix(tex_a, tex_b, gl_TessCoord.y);

    float height = getHeightFieldHeight(hfTexCoord);
    position.y = height;
    //position.y = getHeightFieldHeightMin();

    gl_Position = gl_ModelViewProjectionMatrix * position;
    tcPosition = gl_Position;
    gl_TexCoord[HFTexCoordID].xy = hfTexCoord;

    // a vertex is on the edge of a patch if one of the tess coords is 0
    onEdge = float((gl_TessCoord.x == 0 || gl_TessCoord.y == 0));
    teDistanceToMinHeight = height - getHeightFieldHeightMin();
}

The fragment shader uses the reative height of the vertex belonging to the fragment at hand to access a 1D height palett texture. Please ignore the height gradient for now. It's used to calc the normals. This works completely fine.

i开发者_开发技巧n float onEdge;
in float teDistanceToMinHeight;
in vec4 tcPosition;

out vec4 FragColor;

vec3
getHeightMapGradient(in vec2      ts_position,
                     in vec2      texel_offset)
{
    vec3 x = vec3(2.0 * texel_offset.x, 0.0, getHeightFieldHeight(ts_position + vec2(texel_offset.x, 0.0))
                                           - getHeightFieldHeight(ts_position - vec2(texel_offset.x, 0.0)));


    vec3 y = vec3(0.0, 2.0 * texel_offset.y, getHeightFieldHeight(ts_position + vec2(0.0, texel_offset.y))
                                           - getHeightFieldHeight(ts_position - vec2(0.0, texel_offset.y)));
    return cross(x, y);
}

void main()
{
    if(teDistanceToMinHeight < 0.00001){
        // filter points near the zero position
        discard;
    }

    // attributes
    vec2 hfTexCoords = gl_TexCoord[HFTexCoordID].xy;
    //float hfPaletteTexCoord = getHeightFieldHeight(hfTexCoords) / HeightFieldHeight;
    float hfPaletteTexCoord = (texture(HeightField, hfTexCoords).r -HeightFieldLowering);


    vec2 heightMapSize      = vec2(textureSize(HeightField, 0).xy);
    vec2 heightMapTexelSize = vec2(1.0) / vec2(heightMapSize);


    // some standard colors
    vec4 white = vec4(1);
    vec4 yellow = vec4(1,1,0,1);
    vec4 blue = vec4(0,0,1,1);

    // get the color
    FragColor = texture(HeightFieldPalette, hfPaletteTexCoord ); // use height field  palette as color

    if(onEdge > 0.9 && ShowOriginalGrid == 1 ){
        FragColor = mix(FragColor, yellow, 0.5);
    }

    // shading
    vec3 n = normalize(getHeightMapGradient(hfTexCoords, heightMapTexelSize).xzy);
    vec3 l = vec3(1,1,0);
    vec3 v = normalize(CameraPosition - tcPosition.xyz);
    vec3 h = normalize(l + v);

    float df= dot(n, l);

    FragColor = (FragColor * (df * 0.5 + 0.5)) // diffuse
                + vec4(1) * pow(max(0.0, dot(n,h)), 60.0) // specular
                + 0.1; // ambient


}

Includes before each shader is the following code. It contains mainly all uniform and helper functions.

#version 400 compatibility

// defines
#define HFTexCoordID 0

// environment
uniform ivec2 ScreenSize = ivec2(800,600);
uniform vec3 CameraPosition = vec3(0);

// tesselation
uniform float MaxEdgeLength = 4;

// height field
uniform float   HeightFieldHeight = 1;
uniform float   HeightFieldLowering = 0.2;

uniform sampler2D   HeightField;
uniform sampler1D   HeightFieldPalette;

// density map
uniform sampler2D   DensityMap;

// patches
uniform sampler2D[20]   Patches;
uniform int             PatchesCount = 0;
uniform ivec2[20]       PatchesPositions;
uniform float[20]       PatchesHeights;
uniform ivec2[20]       PatchesSizes;

// show options
uniform int ShowOriginalGrid = 0;


// functions
ivec2 getHFPosition(vec2 hfTexCoords){
    return ivec2(textureSize(HeightField, 0).xy * hfTexCoords);
}

ivec2 getPatchSize(in int patchIndex){
    return PatchesSizes[patchIndex];
    //return textureSize(Patches[patchIndex], 0).xy;
}

vec2 toPatchCoords(in int patchIndex, in vec2 hfTexCoords){
    ivec2 hfPosition = getHFPosition(hfTexCoords);
    ivec2 patchStart = PatchesPositions[patchIndex];
    ivec2 patchPos = hfPosition - patchStart;
    //return textureSize(Patches[1], 0).xy;

    return  vec2(patchPos / getPatchSize(patchIndex));
}

float getPatchHeight(in int patchIndex, in vec2 hfTexCoords){
    vec2 patchCoords = toPatchCoords(patchIndex, hfTexCoords);
    // seams like the combination of the for loop with this 
    // texture access results in undefined behavior.
    float relHeight = (texture(Patches[patchIndex], patchCoords).r -0.5);
    return relHeight * PatchesHeights[patchIndex] * HeightFieldHeight;
}

float getPatchedHeight(in vec2 texCoords){
    float patchesHeight = 0;
    // working
    //patchesHeight += getPatchHeight(0, texCoords);
    //patchesHeight += getPatchHeight(1, texCoords);
    //patchesHeight += getPatchHeight(2, texCoords);

    // only works for i < 5 .
    for(int i = 0; i < 6 && i < PatchesCount-1; i++){
        patchesHeight += getPatchHeight(i, texCoords);
    }

    return patchesHeight;
}

float getHeightFieldHeight(in vec2 textureCoordinates){
    float height = (texture(HeightField, textureCoordinates).r -HeightFieldLowering) * HeightFieldHeight;

    height += getPatchedHeight(textureCoordinates);

    return height;
}

float getHeightFieldHeightMin(){
    return (-0.2 * HeightFieldHeight);
}

float getDensity(in vec2 coords){
    return texture(DensityMap, coords).r;
}

The problem

The shaders described and pasted above are all working correctly as long as I don't access the Patches uniform.

uniform sampler2D[20]   Patches;

The idea behind the sampler2D[] is to have a sort of array while each texture of this array may have a different size. I'm aware of the fact that each of this constuct uses (in this case) 20 texture units. This limitation of fine.

The moment I access the Patches uniform the fragment shader only outputs black pixels. The tessellation evaluation shader is working correctly, that I know, because I can see hills in the height field, that arn't part of it.

I'm very thankfull for any suggestions. Regarding this problem.

I know I could use a sampler2DArray, but then each element (texture) has to have the same size. But I need the patch size to be flexable. Cutting patches into textures of a fixed size and stiching them back together in the shader, whould be an alternative, but I don't want to implement this organisation overhead unless I really have to.

Infolog

Visualization Lib

rary v2011.5.1142 [f32]
Jun  9 2011 - 11:36:25 - GCC compiler [RELEASE] [x32]

 --- Environment ---
VL_LOGFILE_PATH <not present>
VL_DATA_PATH <not present>
VL_VERBOSITY_LEVEL = NORMAL
VL_CHECK_GL_STATES = YES

 --- Global Settings --- 
Log file  = log.txt
Data path = ../data
Verbosity level = NORMAL
Check OpenGL States = YES

 --- GLEW ---
GLEW version: 1.5.7

 --- OpenGL Info ---
OpenGL version: 4.1.0 NVIDIA 260.19.21
OpenGL vendor: NVIDIA Corporation
OpenGL renderer: Quadro 6000/PCI/SSE2
OpenGL profile: Compatible
GLSL version: 4.10 NVIDIA via Cg compiler
Max texture size: 16384
Texture coords: 8
Texture conventional units: 4
Texture image units: 32
Anisotropic texture filter: YES, 16X
S3 Texture Compression: YES
Vertex Buffer Object: YES
Pixel Buffer Object: YES
Framebuffer Object: YES
Max vertex attributes: 16
Max varying floats: 60
Max fragment uniform components: 2048
Max vertex uniform components: 4096
Max elements vertices: 1048576
Max elements indices: 1048576

 --- OpenGL Extensions --- 
GL_ARB_blend_func_extended              GL_ARB_color_buffer_float
GL_ARB_compatibility                    GL_ARB_copy_buffer
GL_ARB_depth_buffer_float               GL_ARB_depth_clamp
GL_ARB_depth_texture                    GL_ARB_draw_buffers
GL_ARB_draw_buffers_blend               GL_ARB_draw_indirect
GL_ARB_draw_elements_base_vertex        GL_ARB_draw_instanced
GL_ARB_ES2_compatibility                GL_ARB_explicit_attrib_location
GL_ARB_fragment_coord_conventions       GL_ARB_fragment_program
GL_ARB_fragment_program_shadow          GL_ARB_fragment_shader
GL_ARB_framebuffer_object               GL_ARB_framebuffer_sRGB
GL_ARB_geometry_shader4                 GL_ARB_get_program_binary
GL_ARB_gpu_shader5                      GL_ARB_gpu_shader_fp64
GL_ARB_half_float_pixel                 GL_ARB_half_float_vertex
GL_ARB_imaging                          GL_ARB_instanced_arrays
GL_ARB_map_buffer_range                 GL_ARB_multisample
GL_ARB_multitexture                     GL_ARB_occlusion_query
GL_ARB_occlusion_query2                 GL_ARB_pixel_buffer_object
GL_ARB_point_parameters                 GL_ARB_point_sprite
GL_ARB_provoking_vertex                 GL_ARB_robustness
GL_ARB_sample_shading                   GL_ARB_sampler_objects
GL_ARB_seamless_cube_map                GL_ARB_separate_shader_objects
GL_ARB_shader_bit_encoding              GL_ARB_shader_objects
GL_ARB_shader_precision                 GL_ARB_shader_subroutine
GL_ARB_shading_language_100             GL_ARB_shadow
GL_ARB_sync                             GL_ARB_tessellation_shader
GL_ARB_texture_border_clamp             GL_ARB_texture_buffer_object
GL_ARB_texture_buffer_object_rgb32      GL_ARB_texture_compression
GL_ARB_texture_compression_bptc         GL_ARB_texture_compression_rgtc
GL_ARB_texture_cube_map                 GL_ARB_texture_cube_map_array
GL_ARB_texture_env_add                  GL_ARB_texture_env_combine
GL_ARB_texture_env_crossbar             GL_ARB_texture_env_dot3
GL_ARB_texture_float                    GL_ARB_texture_gather
GL_ARB_texture_mirrored_repeat          GL_ARB_texture_multisample
GL_ARB_texture_non_power_of_two         GL_ARB_texture_query_lod
GL_ARB_texture_rectangle                GL_ARB_texture_rg
GL_ARB_texture_rgb10_a2ui               GL_ARB_texture_swizzle
GL_ARB_timer_query                      GL_ARB_transform_feedback2
GL_ARB_transform_feedback3              GL_ARB_transpose_matrix
GL_ARB_uniform_buffer_object            GL_ARB_vertex_array_bgra
GL_ARB_vertex_array_object              GL_ARB_vertex_attrib_64bit
GL_ARB_vertex_buffer_object             GL_ARB_vertex_program
GL_ARB_vertex_shader                    GL_ARB_vertex_type_2_10_10_10_rev
GL_ARB_viewport_array                   GL_ARB_window_pos
GL_ATI_draw_buffers                     GL_ATI_texture_float
GL_ATI_texture_mirror_once              GL_S3_s3tc
GL_EXT_texture_env_add                  GL_EXT_abgr
GL_EXT_bgra                             GL_EXT_bindable_uniform
GL_EXT_blend_color                      GL_EXT_blend_equation_separate
GL_EXT_blend_func_separate              GL_EXT_blend_minmax
GL_EXT_blend_subtract                   GL_EXT_compiled_vertex_array
GL_EXT_Cg_shader                        GL_EXT_depth_bounds_test
GL_EXT_direct_state_access              GL_EXT_draw_buffers2
GL_EXT_draw_instanced                   GL_EXT_draw_range_elements
GL_EXT_fog_coord                        GL_EXT_framebuffer_blit
GL_EXT_framebuffer_multisample          GL_EXTX_framebuffer_mixed_formats
GL_EXT_framebuffer_object               GL_EXT_framebuffer_sRGB
GL_EXT_geometry_shader4                 GL_EXT_gpu_program_parameters
GL_EXT_gpu_shader4                      GL_EXT_multi_draw_arrays
GL_EXT_packed_depth_stencil             GL_EXT_packed_float
GL_EXT_packed_pixels                    GL_EXT_pixel_buffer_object
GL_EXT_point_parameters                 GL_EXT_provoking_vertex
GL_EXT_rescale_normal                   GL_EXT_secondary_color
GL_EXT_separate_shader_objects          GL_EXT_separate_specular_color
GL_EXT_shader_image_load_store          GL_EXT_shadow_funcs
GL_EXT_stencil_two_side                 GL_EXT_stencil_wrap
GL_EXT_texture3D                        GL_EXT_texture_array
GL_EXT_texture_buffer_object            GL_EXT_texture_compression_latc
GL_EXT_texture_compression_rgtc         GL_EXT_texture_compression_s3tc
GL_EXT_texture_cube_map                 GL_EXT_texture_edge_clamp
GL_EXT_texture_env_combine              GL_EXT_texture_env_dot3
GL_EXT_texture_filter_anisotropic       GL_EXT_texture_integer
GL_EXT_texture_lod                      GL_EXT_texture_lod_bias
GL_EXT_texture_mirror_clamp             GL_EXT_texture_object
GL_EXT_texture_shared_exponent          GL_EXT_texture_sRGB
GL_EXT_texture_swizzle                  GL_EXT_timer_query
GL_EXT_transform_feedback2              GL_EXT_vertex_array
GL_EXT_vertex_array_bgra                GL_EXT_vertex_attrib_64bit
GL_IBM_rasterpos_clip                   GL_IBM_texture_mirrored_repeat
GL_KTX_buffer_region                    GL_NV_blend_square
GL_NV_conditional_render                GL_NV_copy_depth_to_color
GL_NV_copy_image                        GL_NV_depth_buffer_float
GL_NV_depth_clamp                       GL_NV_explicit_multisample
GL_NV_fence                             GL_NV_float_buffer
GL_NV_fog_distance                      GL_NV_fragment_program
GL_NV_fragment_program_option           GL_NV_fragment_program2
GL_NV_framebuffer_multisample_coverage  GL_NV_geometry_shader4
GL_NV_gpu_program4                      GL_NV_gpu_program4_1
GL_NV_gpu_program5                      GL_NV_gpu_program_fp64
GL_NV_gpu_shader5                       GL_NV_half_float
GL_NV_light_max_exponent                GL_NV_multisample_coverage
GL_NV_multisample_filter_hint           GL_NV_occlusion_query
GL_NV_packed_depth_stencil              GL_NV_parameter_buffer_object
GL_NV_parameter_buffer_object2          GL_NV_pixel_data_range
GL_NV_point_sprite                      GL_NV_primitive_restart
GL_NV_register_combiners                GL_NV_register_combiners2
GL_NV_shader_buffer_load                GL_NV_texgen_reflection
GL_NV_texture_barrier                   GL_NV_texture_compression_vtc
GL_NV_texture_env_combine4              GL_NV_texture_expand_normal
GL_NV_texture_multisample               GL_NV_texture_rectangle
GL_NV_texture_shader                    GL_NV_texture_shader2
GL_NV_texture_shader3                   GL_NV_transform_feedback
GL_NV_transform_feedback2               GL_NV_vdpau_interop
GL_NV_vertex_array_range                GL_NV_vertex_array_range2
GL_NV_vertex_attrib_integer_64bit       GL_NV_vertex_buffer_unified_memory
GL_NV_vertex_program                    GL_NV_vertex_program1_1
GL_NV_vertex_program2                   GL_NV_vertex_program2_option
GL_NV_vertex_program3                   GL_NV_video_capture
GL_NVX_conditional_render               GL_NVX_gpu_memory_info
GL_SGIS_generate_mipmap                 GL_SGIS_texture_lod
GL_SGIX_depth_texture                   GL_SGIX_shadow
GL_SUN_slice_accum

 --- GLEW ---
GLEW version: 1.5.7

 --- OpenGL Info ---
OpenGL version: 4.1.0 NVIDIA 260.19.21
OpenGL vendor: NVIDIA Corporation
OpenGL renderer: Quadro 6000/PCI/SSE2
OpenGL profile: Compatible
GLSL version: 4.10 NVIDIA via Cg compiler
Max texture size: 16384
Texture coords: 8
Texture conventional units: 4
Texture image units: 32
Anisotropic texture filter: YES, 16X
S3 Texture Compression: YES
Vertex Buffer Object: YES
Pixel Buffer Object: YES
Framebuffer Object: YES
Max vertex attributes: 16
Max varying floats: 60
Max fragment uniform components: 2048
Max vertex uniform components: 4096
Max elements vertices: 1048576
Max elements indices: 1048576

 --- OpenGL Extensions --- 
GL_ARB_blend_func_extended              GL_ARB_color_buffer_float
GL_ARB_compatibility                    GL_ARB_copy_buffer
GL_ARB_depth_buffer_float               GL_ARB_depth_clamp
GL_ARB_depth_texture                    GL_ARB_draw_buffers
GL_ARB_draw_buffers_blend               GL_ARB_draw_indirect
GL_ARB_draw_elements_base_vertex        GL_ARB_draw_instanced
GL_ARB_ES2_compatibility                GL_ARB_explicit_attrib_location
GL_ARB_fragment_coord_conventions       GL_ARB_fragment_program
GL_ARB_fragment_program_shadow          GL_ARB_fragment_shader
GL_ARB_framebuffer_object               GL_ARB_framebuffer_sRGB
GL_ARB_geometry_shader4                 GL_ARB_get_program_binary
GL_ARB_gpu_shader5                      GL_ARB_gpu_shader_fp64
GL_ARB_half_float_pixel                 GL_ARB_half_float_vertex
GL_ARB_imaging                          GL_ARB_instanced_arrays
GL_ARB_map_buffer_range                 GL_ARB_multisample
GL_ARB_multitexture                     GL_ARB_occlusion_query
GL_ARB_occlusion_query2                 GL_ARB_pixel_buffer_object
GL_ARB_point_parameters                 GL_ARB_point_sprite
GL_ARB_provoking_vertex                 GL_ARB_robustness
GL_ARB_sample_shading                   GL_ARB_sampler_objects
GL_ARB_seamless_cube_map                GL_ARB_separate_shader_objects
GL_ARB_shader_bit_encoding              GL_ARB_shader_objects
GL_ARB_shader_precision                 GL_ARB_shader_subroutine
GL_ARB_shading_language_100             GL_ARB_shadow
GL_ARB_sync                             GL_ARB_tessellation_shader
GL_ARB_texture_border_clamp             GL_ARB_texture_buffer_object
GL_ARB_texture_buffer_object_rgb32      GL_ARB_texture_compression
GL_ARB_texture_compression_bptc         GL_ARB_texture_compression_rgtc
GL_ARB_texture_cube_map                 GL_ARB_texture_cube_map_array
GL_ARB_texture_env_add                  GL_ARB_texture_env_combine
GL_ARB_texture_env_crossbar             GL_ARB_texture_env_dot3
GL_ARB_texture_float                    GL_ARB_texture_gather
GL_ARB_texture_mirrored_repeat          GL_ARB_texture_multisample
GL_ARB_texture_non_power_of_two         GL_ARB_texture_query_lod
GL_ARB_texture_rectangle                GL_ARB_texture_rg
GL_ARB_texture_rgb10_a2ui               GL_ARB_texture_swizzle
GL_ARB_timer_query                      GL_ARB_transform_feedback2
GL_ARB_transform_feedback3              GL_ARB_transpose_matrix
GL_ARB_uniform_buffer_object            GL_ARB_vertex_array_bgra
GL_ARB_vertex_array_object              GL_ARB_vertex_attrib_64bit
GL_ARB_vertex_buffer_object             GL_ARB_vertex_program
GL_ARB_vertex_shader                    GL_ARB_vertex_type_2_10_10_10_rev
GL_ARB_viewport_array                   GL_ARB_window_pos
GL_ATI_draw_buffers                     GL_ATI_texture_float
GL_ATI_texture_mirror_once              GL_S3_s3tc
GL_EXT_texture_env_add                  GL_EXT_abgr
GL_EXT_bgra                             GL_EXT_bindable_uniform
GL_EXT_blend_color                      GL_EXT_blend_equation_separate
GL_EXT_blend_func_separate              GL_EXT_blend_minmax
GL_EXT_blend_subtract                   GL_EXT_compiled_vertex_array
GL_EXT_Cg_shader                        GL_EXT_depth_bounds_test
GL_EXT_direct_state_access              GL_EXT_draw_buffers2
GL_EXT_draw_instanced                   GL_EXT_draw_range_elements
GL_EXT_fog_coord                        GL_EXT_framebuffer_blit
GL_EXT_framebuffer_multisample          GL_EXTX_framebuffer_mixed_formats
GL_EXT_framebuffer_object               GL_EXT_framebuffer_sRGB
GL_EXT_geometry_shader4                 GL_EXT_gpu_program_parameters
GL_EXT_gpu_shader4                      GL_EXT_multi_draw_arrays
GL_EXT_packed_depth_stencil             GL_EXT_packed_float
GL_EXT_packed_pixels                    GL_EXT_pixel_buffer_object
GL_EXT_point_parameters                 GL_EXT_provoking_vertex
GL_EXT_rescale_normal                   GL_EXT_secondary_color
GL_EXT_separate_shader_objects          GL_EXT_separate_specular_color
GL_EXT_shader_image_load_store          GL_EXT_shadow_funcs
GL_EXT_stencil_two_side                 GL_EXT_stencil_wrap
GL_EXT_texture3D                        GL_EXT_texture_array
GL_EXT_texture_buffer_object            GL_EXT_texture_compression_latc
GL_EXT_texture_compression_rgtc         GL_EXT_texture_compression_s3tc
GL_EXT_texture_cube_map                 GL_EXT_texture_edge_clamp
GL_EXT_texture_env_combine              GL_EXT_texture_env_dot3
GL_EXT_texture_filter_anisotropic       GL_EXT_texture_integer
GL_EXT_texture_lod                      GL_EXT_texture_lod_bias
GL_EXT_texture_mirror_clamp             GL_EXT_texture_object
GL_EXT_texture_shared_exponent          GL_EXT_texture_sRGB
GL_EXT_texture_swizzle                  GL_EXT_timer_query
GL_EXT_transform_feedback2              GL_EXT_vertex_array
GL_EXT_vertex_array_bgra                GL_EXT_vertex_attrib_64bit
GL_IBM_rasterpos_clip                   GL_IBM_texture_mirrored_repeat
GL_KTX_buffer_region                    GL_NV_blend_square
GL_NV_conditional_render                GL_NV_copy_depth_to_color
GL_NV_copy_image                        GL_NV_depth_buffer_float
GL_NV_depth_clamp                       GL_NV_explicit_multisample
GL_NV_fence                             GL_NV_float_buffer
GL_NV_fog_distance                      GL_NV_fragment_program
GL_NV_fragment_program_option           GL_NV_fragment_program2
GL_NV_framebuffer_multisample_coverage  GL_NV_geometry_shader4
GL_NV_gpu_program4                      GL_NV_gpu_program4_1
GL_NV_gpu_program5                      GL_NV_gpu_program_fp64
GL_NV_gpu_shader5                       GL_NV_half_float
GL_NV_light_max_exponent                GL_NV_multisample_coverage
GL_NV_multisample_filter_hint           GL_NV_occlusion_query
GL_NV_packed_depth_stencil              GL_NV_parameter_buffer_object
GL_NV_parameter_buffer_object2          GL_NV_pixel_data_range
GL_NV_point_sprite                      GL_NV_primitive_restart
GL_NV_register_combiners                GL_NV_register_combiners2
GL_NV_shader_buffer_load                GL_NV_texgen_reflection
GL_NV_texture_barrier                   GL_NV_texture_compression_vtc
GL_NV_texture_env_combine4              GL_NV_texture_expand_normal
GL_NV_texture_multisample               GL_NV_texture_rectangle
GL_NV_texture_shader                    GL_NV_texture_shader2
GL_NV_texture_shader3                   GL_NV_transform_feedback
GL_NV_transform_feedback2               GL_NV_vdpau_interop
GL_NV_vertex_array_range                GL_NV_vertex_array_range2
GL_NV_vertex_attrib_integer_64bit       GL_NV_vertex_buffer_unified_memory
GL_NV_vertex_program                    GL_NV_vertex_program1_1
GL_NV_vertex_program2                   GL_NV_vertex_program2_option
GL_NV_vertex_program3                   GL_NV_video_capture
GL_NVX_conditional_render               GL_NVX_gpu_memory_info
GL_SGIS_generate_mipmap                 GL_SGIS_texture_lod
GL_SGIX_depth_texture                   GL_SGIX_shadow
GL_SUN_slice_accum

PatchesContainer::PatchesContainer: working dir: ./data/patches/pick_height_testing_png/
PatchesContainer::loadPatchesFromWorkingDir ignoring file = data/patches/pick_height_testing_png/.svn
Patch::initialize(): name   = data/patches/pick_height_testing_png/patch01-position=20x20-maxHeight=1.0.png
width  = 50
height = 50
depth  = 0
format = IF_LUMINANCE
type   = IT_UNSIGNED_BYTE
pitch  = 50
bytealign = 1
Patch::initialize(): name   = data/patches/pick_height_testing_png/patch02-position=20x2-maxHeight=1.5.png
width  = 20
height = 20
depth  = 0
format = IF_LUMINANCE
type   = IT_UNSIGNED_BYTE
pitch  = 20
bytealign = 1
Found matching densitymap ./data/density_maps/pick_height_testing_png.png
loading height field image
name   = ./data/horizons/pick_height_testing.png
width  = 200
height = 200
depth  = 0
format = IF_LUMINANCE
type   = IT_UNSIGNED_BYTE
pitch  = 200
bytealign = 1
name   = ./data/textures/tesselation_palette_blue_red.png
width  = 300
height = 0
depth  = 0
format = IF_RGB
type   = IT_UNSIGNED_BYTE
pitch  = 900
bytealign = 1
GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS: 32


Well, I can see one problem:

uniform sampler2D[20] Patches;

I'm going to go out on a limb and guess that your OpenGL 4.0-class hardware is incapable of using more than 16 textures within a single shader stage. If you want to verify this, check GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS; I'd bet it's 16.

Also, the rules for accessing sampler arrays are very strict (and I'm betting you're breaking them). The indices for sampler arrays must, in GLSL 4.00, be either:

1: Compile-time constant expressions

2: Expressions that resolve to uniform values. Not uniform as in the keyword, but expressions that are based on compile-time constants or uniform values. They cannot be based on values retrieved from textures, from shader-stage inputs, or anything of the kind.

This is legal:

for(int i = 0; i < someUniform; i++)
{
    texture(Patches[i], texCoord);
}

This is not legal:

texture(Patches[positionOfSomeVertex * uniformScaleFactor], texCoord);

There's a reason why people use array textures instead of sampler arrays.


Adendum: Perhaps a quote from the GLSL version 4.10 specification would help:

A fragment-shader expression is dynamically uniform if all fragments evaluating it get the same resulting value. When loops are involved, this refers to the expression's value for the same loop iteration. When functions are involved, this refers to calls from the same call point.

This is similarly defined for other shader stages, based on the per-instance data they process.

Note that constant expressions are trivially dynamically uniform. It follows that typical loop counters based on these are also dynamically uniform.

Your expression involves a conditional branch based on something that is not dynamically uniform. Therefore, the index used is not dynamically uniform.

The basic idea with "dynamically uniform" is this: given the same uniform values, I should be able to pass anything as shader stage inputs and the same texture will be accessed from the array. Your code does not guarantee this.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜