OpenGL 3.3 und GLSL Uniform Problem

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Mr.Betatester
Beiträge: 12
Registriert: 21.06.2010, 20:00
Kontaktdaten:

OpenGL 3.3 und GLSL Uniform Problem

Beitrag 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
Benutzeravatar
kimmi
Moderator
Beiträge: 1412
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: OpenGL 3.3 und GLSL Uniform Problem

Beitrag 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
Mr.Betatester
Beiträge: 12
Registriert: 21.06.2010, 20:00
Kontaktdaten:

Re: OpenGL 3.3 und GLSL Uniform Problem

Beitrag 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.
Benutzeravatar
kimmi
Moderator
Beiträge: 1412
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: OpenGL 3.3 und GLSL Uniform Problem

Beitrag 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
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: OpenGL 3.3 und GLSL Uniform Problem

Beitrag 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.
Mr.Betatester
Beiträge: 12
Registriert: 21.06.2010, 20:00
Kontaktdaten:

Re: OpenGL 3.3 und GLSL Uniform Problem

Beitrag 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 :-).
Benutzeravatar
kimmi
Moderator
Beiträge: 1412
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: OpenGL 3.3 und GLSL Uniform Problem

Beitrag 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
Antworten