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.
精彩评论