Seite 1 von 1

OpenGL 3.3 und GLSL Uniform Problem

Verfasst: 21.06.2010, 20:07
von Mr.Betatester
Hi
ich versuche mir gerade eine Font Klasse zu erstellen doch leider scheitere ich beim einfärben meiner Schrift :-(

vertex shader

Code: Alles auswählen

#version 150 core
precision highp float;

in vec3 in_position;
in vec2 in_texCoord;

uniform vec2 position;
uniform vec2 screenSize;
uniform vec4 charPosSize;
uniform float textureSize;


out vec2 ex_texCoord;

void main(void)
{

	vec4 charPS = charPosSize / textureSize;
	ex_texCoord.x = charPS.x + in_texCoord.x * (charPS.z);
	ex_texCoord.y = 1.0 - (charPS.y + (1.0 - in_texCoord.y) * (charPS.w));


	float x = (in_position.x * charPosSize.z + position.x) * (2.0 / screenSize.x);
	float y = (in_position.y * charPosSize.w + position.y) * (-2.0 / screenSize.y);
	gl_Position = vec4(x - 1.0, y + 1.0, in_position.z, 1.0);
}

fragment shader

Code: Alles auswählen

#version 150 core
precision highp float;

in vec2 ex_texCoord;
out vec4 glFragColor;

uniform vec4 fontColor;
uniform sampler2D texture;


void main(void)
{
	vec4 texColor = texture2D(texture, ex_texCoord);
	
	glFragColor = texColor * fontColor; // do not work
	//glFragColor = texColor * vec4(0.7f, 0.7f, 0.2f, 1.0f); // work
}
warum kann ich die uniform variable nicht setzen? bei uniform vec4 charPosSize funktioniert es doch auch.

Code: Alles auswählen

	AShader::setUniform(shader->getUniformLocation("charPosSize"), (float)m_letterSize[i][0], (float)m_letterSize[i][1],
				(float)m_letterSize[i][2], (float)m_fontHeight);
		AShader::setUniform(shader->getUniformLocation("fontColor"), 
				0.7f, 0.7f, 0.2f, 1.0f);
Danke schon mal im Vorraus
Mr.Betatester

Re: OpenGL 3.3 und GLSL Uniform Problem

Verfasst: 22.06.2010, 09:27
von kimmi
GLSL-Uniform-Variablen, die nicht referenziert werden, werden prinzipiell herausoptimiert und sind dann nicht mehr lokalisierbar, also auch nicht mehr modifizierbar. Setzt du in deinem Code auch wirklich die jeweiligen Uniform-Variable einmal im Vertex- und einmal im Fragmentshader? Für mich sieht das so aus, wie wenn du immer den gleichen Shader nimmst. Dann geht das setzen der Farbe schief, da hier die Variable nicht referenziert wird. Da das Setzten der Position des Fonts hinhaut, denke ich mal, daß das der Vertexshader ist.
Setz die Farbe einfach mal im Fragmentshader oder referenzier die Farbe auch einmal im Vertexshader.

Gruß Kimmi

Re: OpenGL 3.3 und GLSL Uniform Problem

Verfasst: 22.06.2010, 11:24
von Mr.Betatester
shader->getUniformLocation("fontColor") bringt mir einen Wert != -1 demzufolge sollte er sie ja nicht gelöscht haben (wobei mir aufgefallen ist, meine ATI Karte keine unbenutzten Variablen löscht nur meine Nvidia). Wie kann ich uniforme variablen im Fragment Shader einzeln setzen? Ich binde immer das Shader Programm und das besteht bei mir aus Vertex und Fragment Shader.

Re: OpenGL 3.3 und GLSL Uniform Problem

Verfasst: 22.06.2010, 11:42
von kimmi
Hm, in der Tat merkwürdig. Hast du mal den Fehlercode ausgewertet, ob da beim Setzen irgendwas schiefgegangen ist? Hast du mal die Farbe nur allein gesetzt, ohne davor die andere Uniform-Variable zu setzen? Vielleicht ist was an deiner setUniform-Methode krumm. In dem Dunstkreis würde ich mich mal gewegen. So ist es schwer, einen Fehler zu sehen. Ein OpenGL-Debugger könnte auch hilfreich sein.

Gruß Kimmi

Re: OpenGL 3.3 und GLSL Uniform Problem

Verfasst: 22.06.2010, 13:34
von Aramis
keine unbenutzten Variablen löscht nur meine Nvidia
Ja, der GLSL-Compiler wird ja vom Treiber bereitgestellt.
IIRC nutzt NVIDIA dafuer ihr Cg-Backend, das vergleichsweise reif ist.

Re: OpenGL 3.3 und GLSL Uniform Problem

Verfasst: 23.06.2010, 07:37
von Mr.Betatester
Ich hab den Fehler nach langem Suchen dann endlich gefunden. Die Codezeilen oben funktionieren alle so wie sie sollen, auch meine Shaderklasse arbeitet richtig :-). Wie immer liegt der Fehler bei dem der davor sitzt :-). Ich hatte in meiner Painterklasse, wo ich die Renderauflösung an den Shader übergebe, einen falschen Shader benutzt um die Uniformlocation zu bekommen. Meine Debugfunktionen merkten dies nicht, weil auch dieser Shader den Uniformnamen mit dem selben Typen verwendete :-).

Re: OpenGL 3.3 und GLSL Uniform Problem

Verfasst: 23.06.2010, 09:16
von kimmi
Super, das du den dann gefunden hast. Einen Tipp von meiner Seite: wenn deine Debugfunktion hier nicht ausreichend Infos bereitgestellt hat, erweitere sie gleich. Aus leidvoller Erfahrung meinerseits kann ich dir sagen: das wird wieder passieren, wenn du nichts machst!

Gruß Kimmi