PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Texturen unter OpenGL im Shader


Rumbah
2006-09-13, 17:54:39
Ich hoffe, jemand kann mir helfen.

Ich möchte im Shader Daten verarbeiten, und dafür möchte ich die Ausgangsdaten in einer Textur speichern, dann im Shader auslesen und am Ende berechnungen damit durchführen. Nur funktioniert das bei mir nicht so richtig, und ich weiß nicht warum. Also, meine Testtextur ist:

GLfloat testtext1[] = {
1.f, 1.f, 1.f,
0.f, 0.f, 3.f,};
Dann mach ich:
glGenTextures( 1, &texId1);
glBindTexture( GL_TEXTURE_1D, texId1);
glTexParameteri( GL_TEXTURE_1D, GL_GENERATE_MIPMAP, GL_FALSE);
glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage1D( GL_TEXTURE_1D, 0, GL_RGB_FLOAT32_ATI, 2, 0, GL_RGB, GL_FLOAT, testtext1);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_1D, texId1);

Nach dem Linken dann:
texLoc[0] = glGetUniformLocation(shaderProg, "texture1");
glUniform1i(texLoc[0], 0);

Der Shader enthält dann:

uniform sampler1D texture1;
vec3 n1, n2, v1[3], v2[3];
float p1[3], p2[3], d1[3], d2[3], t1b, t1e, t2b, t2e, tempFloat;

void main()
{
vec4 temp = gl_FragCoord;
for (int i = 0; i<3; i++)
{
v1[i] = vec3( texture1D(texture1, 0.3 ) );
v2[i] = vec3( texture1D(texture1, 0.7 ) );
}
if ( v1[1] == vec3(1.,1.,1.))
{
gl_FragColor = vec4( 0., 0., 1., 1.);
}
else
{
gl_FragColor = vec4( 1., 0., 0., 1.);
}
}

Die vielen Variablen sind für spätere Sachen gedacht, die ich gleich mit reingepackt habe.
Nun aber mein Problem:
So, wie es oben angegeben ist, wird alles blau, weil das Textursample an der Stelle 0.3 (1., 1., 1.) ist. So sollte es ja auch sein. Aber das Textursample an der Stelle 0.7 (also in v2[1]) ist nicht (0., 0., 3.), denn ewnn ich die If Abfrage durch
if ( v2[1] == vec3(0.,0.,3.))
ersetze, ist alles rot, also war die Abfrage negativ.Und ich habe keine Ahnung warum. Ist die Textur falsch erzeugt?


Rumbah

Neomi
2006-09-13, 19:47:47
Abfragen, ob zwei Werte gleich sind, sind bei Floats immer ein wenig kritisch. Es gibt z.B. kein 0.3, sondern nur eine Float-Repräsentation, die in etwa 0.3 entspricht, aber doch ein klein wenig abweicht. 1.0 dagegen ist exakt darstellbar, deshalb gibt es dabei keine Probleme.

Gib doch mal ganz ohne Verzweigung den Wert aus, den du vom Sampler bekommst. Da die möglichen Werte im darstellbaren Bereich liegen, wirst du direkt sehen, ob der falsche Wert kommt oder die Abfrage leicht danebengreift.

Xmas
2006-09-13, 21:38:48
Neomi, es handelt sich um 3.0, was wie 1.0 genau darstellbar ist.

glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_1D);
Fehlt das vielleicht? ;)

Neomi
2006-09-13, 21:59:41
Neomi, es handelt sich um 3.0, was wie 1.0 genau darstellbar ist.

Hoppla, zu schnell gelesen. Damit erübrigt sich dann auch die reine Darstellung des Sampleroutputs, zumindest unskaliert. Aber grundsätzlich ist es keine verkehrte Idee, erstmal einen Debugoutput zu erstellen, indem man die Einzelkomponenten eines Shaders ausspuckt und auf ihre Richtigkeit überprüft.

Expandable
2006-09-13, 22:54:11
Neomi, es handelt sich um 3.0, was wie 1.0 genau darstellbar ist.

glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_1D);
Fehlt das vielleicht? ;)

Texturing muss man nicht mehr aktivieren, wenn man Shader verwendet. Das macht ja der Shader ;)

Rumbah
2006-09-13, 23:17:48
Vielen Dank für die Hilfe, es war wirklich die Rechenungenauigkeit. Der Wert war dann irgendwas im Bereich von 3,00000001 oder so.

Xmas
2006-09-14, 02:33:29
Texturing muss man nicht mehr aktivieren, wenn man Shader verwendet. Das macht ja der Shader ;)
Stimmt auch wieder.

Vielen Dank für die Hilfe, es war wirklich die Rechenungenauigkeit. Der Wert war dann irgendwas im Bereich von 3,00000001 oder so.
Ein FP-Format das keine 3 genau darstellen kann? :eek: Ich fall vom Hocker...