fragment program: error C9999: symbol "@TMP0" already in table

Started by
1 comment, last by Robert Frunzke 17 years, 7 months ago
A fragment shader (compiled to 235 instruction on nvidia gpu) works well on 7800, and 7600. But not on the 7300. There it throws this error: (0) : error C9999: symbol "@TMP0" already in table What does it mean? Searching google didn't help. The posts in this forum on this topic did not help. I could break down the problem to the following code fragment (commenting it out helped, the rest of the shader works fine):

vec4 local_reflection = vec4(0.0,0.0,0.0,0.0);
float r = ReflectionOffset;
const vec3 R1 = reflect(-E,N);
const vec3 R = fDistanceUndisplaced * R1;
const vec2 dN = (ReflectionDisplacement / fDistanceUndisplaced ) * N.xz;
for( int i=0; i<5; i++, r -= 0.5 * ReflectionOffset ) {
	vec4 dPos = ReflectionMatrix * vec4( position + r*R, 1.0 );
	dPos.xy /= dPos.w;
	dPos.xy += vec2(1.0,1.0);
	dPos.xy *= window_dim_half;
	dPos.xy += dN;
	local_reflection += textureRect( ReflectionMap, dPos.xy );
}
local_reflection *= 0.2;
It computes a local reflection on a hardly planar surface (an ocean) and takes multiple samples to emulate a slightly diffuse reflection.
Advertisement
post the whole shader.... take the vec4 dPos out of the loop and declare it ahead of the loop. just a thought

and this
for( int i=0; i<5; i++, r -= 0.5 * ReflectionOffset )

I guess I never seen a for loop like that before?
Quote:I guess I never seen a for loop like that before?


No, the second iterator part is no problem. I also had the "r -= 0.5 * ReflectionOffset;" inside the for loop, and the error was the same.

The whole shader:

uniform sampler2D NormalMap;uniform samplerRect ReflectionMap;uniform samplerCube ReflectionCubeMap;uniform sampler2D UnderwaterMap;uniform float water_height;uniform vec3  deepColor;uniform vec3 skyFilterColor;uniform float nSnell;uniform float Kdiffuse;uniform vec3  airColor;uniform float UnderWaterMapScale;uniform float UnderWaterDistance;uniform vec3 UnderWaterMapFilter;// reflectionsuniform float SpecularShininess;uniform vec3 SpecularCoefficients;// reflections tweakinguniform float ReflectionDisplacement, ReflectionOffset;uniform mat4 ReflectionMatrix;uniform vec2 window_dim_half;// bump mapping parametersuniform vec2 bumpTextureScale;uniform vec2 bump_delta1, bump_delta2, bump_delta3; // time dependent translationsuniform float bumpScale;// atmosphereuniform vec3 v3CameraPos;		// The camera's current positionuniform vec3 v3LightPos;		// The direction vector to the light sourceuniform vec3 bR;				// Rayleigh coefficientsuniform vec3 bM;				// Mie coefficientsuniform vec4 Esun;				// Sun irradianceuniform float g;				// Hanyey/Greenstein phase function eccentricityuniform float scale1;			// Geometry to Shader scalevarying vec3 position;varying vec3 normal;varying mat3 tangentSpaceMatrix;void main(void) {	const vec3 eyeVector = normalize( v3CameraPos - position );	const float fDistanceUndisplaced = distance( vec3(position.x,water_height,position.z), v3CameraPos );	// calculate texture coordinates for normal map lookup & compute normal	const vec2 bumpuv = gl_TexCoord[0].xy * bumpTextureScale;    const vec3 t0 = texture2D(NormalMap, bumpuv + bump_delta1).xyz;    const vec3 t1 = texture2D(NormalMap, bumpuv * 2.0 + bump_delta2).xyz;    const vec3 t2 = texture2D(NormalMap, bumpuv * 4.0 + bump_delta3).xyz;    const vec3 N = normalize( ( tangentSpaceMatrix * ( 2.0 * (t0 + t1 + t2) - 3.0 ) ) );    const vec3 E = eyeVector;	// compute reflectivity	const float thetai = acos( abs( dot(E,N) ) );	const float thetat = asin( sin(thetai) / nSnell );	const float fs = sin(thetai - thetat) / sin(thetai + thetat);	const float ts = tan(thetai - thetat) / tan(thetai + thetat);	const float reflectivity = 0.5 * ( fs*fs + ts*ts );	const float dist = exp( - fDistanceUndisplaced * Kdiffuse );	vec4 local_reflection = vec4(0.0,0.0,0.0,0.0);		// &lt;problem occurs in this part&gt;	float r = ReflectionOffset;	const vec3 R1 = reflect(-E,N);	const vec3 R = fDistanceUndisplaced * R1;	const vec2 dN = (ReflectionDisplacement / fDistanceUndisplaced ) * N.xz;	for( int i=0; i&lt;5; i++ ) {		vec4 dPos = ReflectionMatrix * vec4( position + r*R, 1.0 );		dPos.xy /= dPos.w;		dPos.xy = window_dim_half * ( dPos.xy + vec2(1.0,1.0) ); // translate and scale to 0..1 and scale to viewport coordinates		local_reflection += textureRect( ReflectionMap, dPos.xy + dN );		r -= 0.5 * ReflectionOffset;	}	local_reflection *= 0.2;	// &lt;/problem occurs in this part&gt;	vec3 Rg = reflect(E,N);	Rg.z = -Rg.z;	if( Rg.y &gt; 0.0 ) Rg.y = 0.0; // clip to above water	vec4 global_reflection = textureCube( ReflectionCubeMap, Rg );	// add specular term to global_reflection	if( dot(N,v3LightPos) &gt; 0.0 && (Esun.r+Esun.g+Esun.b) &gt; 0.0 ) {		const vec3 L = -v3LightPos;		const vec3 Rl = reflect(L,N);		const float spec1 = pow( dot(Rl,E), SpecularShininess );		if( spec1 &gt; 0.0 ) {			const vec3 spec = spec1 * Esun.rgb * SpecularCoefficients;			global_reflection.rgb += spec;		}	}	// mix reflection terms	vec3 sky = skyFilterColor * mix( global_reflection.rgb, local_reflection.rgb, local_reflection.a );	// compute refracted ray and intersect ray with underwater plane	const vec3 RE = refract(E,N,1.0/nSnell);	const vec3 groundPosition = UnderWaterMapScale * ( vec3(position.x,0.0,position.z) + (UnderWaterDistance/RE.y) * RE );	// attenuate airColor and upwelling at night	const float attenuate = clamp( 1.0 + 2.5 * v3LightPos.y, 0.0, 1.0 );	// final upwelling term	const vec3 upwelling = attenuate * ( (vec3(1.0,1.0,1.0)-UnderWaterMapFilter) * deepColor + UnderWaterMapFilter * texture2D( UnderwaterMap, (groundPosition.xz) ).xyz );	// combine results	const vec3 color = dist * ( reflectivity * sky + (1.0-reflectivity) * upwelling ) + (1.0-dist) * attenuate * airColor;	gl_FragColor = vec4( AtmosphericScattering( position, N, color, scale1, v3CameraPos, v3LightPos, Esun, bR, bM, g ), 1.0 );}

This topic is closed to new replies.

Advertisement