Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

1

01.07.2012, 12:55

Text ausgeben/rendern mit OpenGL

Hallo




Ich möchte verschiedene
Statusinformationen (FPS usw.) als 2D Text (möglichst Windows TTF)
in meiner 3D-Szene anzeigen/rendern. Wie tut man das am
effizientesten ?
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

01.07.2012, 13:00

Am effizientesten, indem du die Schriftzeichen zunächst in einer Textur speicherst (Bitmap Font) und dann für jedes darzustellende Zeichen ein Rechteck auf dem Bildschirm mit den passenden Texturkoordinaten zeichnest. Im Wiki in der Link-Sammlung findest du einen Link zu Bitmap Font-Generatoren.

3

01.07.2012, 14:11

Hier ist ein gutes Tutorial über die Textausgabe (OpenGL 3.3). Hatte mir ziemlich geholfen.

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

4

04.07.2012, 11:52

Hallo

Ich habe mal mit einer einfachen Textur ein 2D overlay in einer 3D Szene versucht. (so wie oben beschrieben)
Nix zu sehen. Die 3D Szene läuft normal ab aber weit und breit kein 2D Rechteck zu sehen.
Ich vermute das ich bei dem Shader ein Problem habe.

Hier der Shader Code:

**********************************Vertex Shader ************************************
#version 130
precision highp float;
precision highp int;

in vec2 _v2Vertex;
in vec2 _v2Texture;

out vec2 _v2Texture_;

void main (void)
{
_v2Texture_ = _v2Texture;
gl_Position = vec4(_v2Vertex.x, _v2Vertex.y, 0.0, 1.0);
}




**********************************Fragment Shader ************************************
#version 130
precision highp float;
precision highp int;

uniform sampler2D u_s2dColorMap;

in vec2 _v2Texture_;

out vec4 _v4FragColor;

void main (void)
{
_v4FragColor = texture(u_s2dColorMap, _v2Texture_);
}


Ist der Shader für die Darstellung von 2D objekten OK ????
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

04.07.2012, 12:53

Stimmen denn die Vertexattribute?
@D13_Dreinig

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

6

04.07.2012, 13:13

Sollte ...


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// triangle 1 
Vertex[0] = CVector2(100.0f, 100.0f); 
Vertex[1] = CVector2(100.0f, 200.0f); 
Vertex[2] = CVector2(200.0f, 200.0f); 
// triangle 2 
Vertex[3] = CVector2(100.0f, 100.0f); 
Vertex[4] = CVector2(200.0f, 200.0f); 
Vertex[5] = CVector2(200.0f, 100.0f); 
// texture trianngle 1 
Texture[0] = CVector2(0.0f, 1.0f); 
Texture[1] = CVector2(0.0f, 0.0f); 
Texture[2] = CVector2(1.0f, 0.0f); 
// texture trianngle 2 
Texture[3] = CVector2(0.0f, 1.0f); 
Texture[4] = CVector2(1.0f, 0.0f); 
Texture[5] = CVector2(1.0f, 1.0f); 
ShaderText.Use(); 
g_glErr = glGetError(); 
GL::glBindBuffer(GL_ARRAY_BUFFER, unBuffer); 
g_glErr = glGetError(); 

GL::glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) + sizeof(Texture), NULL, GL_STATIC_DRAW); 
g_glErr = glGetError(); 
GL::glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertex), Vertex); 
g_glErr = glGetError(); 
GL::glBufferSubData(GL_ARRAY_BUFFER, sizeof(Vertex), sizeof(Texture), Texture); 
g_glErr = glGetError(); 
GL::glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
g_glErr = glGetError(); 
GL::glEnableVertexAttribArray(0); 
g_glErr = glGetError(); 
GL::glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)sizeof(Vertex)); 
g_glErr = glGetError(); 
GL::glEnableVertexAttribArray(1); 
g_glErr = glGetError(); 
glPolygonMode(GL_FRONT_AND_BACK, nFillStyle); 
glDrawArrays(GL_TRIANGLES, 0, 6); 
g_glErr = glGetError();
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »stef« (04.07.2012, 13:22) aus folgendem Grund: GL::glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) + sizeof(Texture), NULL, GL_STATIC_DRAW); g_glErr = glGetError(); Hatte gefehlt, geht aber trotzdem nicht !!!


stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

7

04.07.2012, 14:45

Hat sich erledigt !!!

Die Vertex-Koordinaten sind mit 100.0f out or range weil OpenGL dynamische Werte zwischen -1.0f und 1.0f erwartet.
Mit den umgerechneten neuen Koordinaten läuft die Sache.

Trotzdem vielen Dank
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

Werbeanzeige