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

21

22.07.2012, 18:11

Die Textur wird anscheinend an der unteren Kante in der Mitte gedreht.

@DeKugelschieber: "(-flaeche.breite/2, -flaeche.hoehe/2, 0);" Welche Fläche? Die von der Textur?

MfG
Delop

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

22

22.07.2012, 18:57

Das hat nichts mit der Textur zu tun, die wird später nur auf die Vertices gemappt. Das heißt wenn du diese drehst oder verzerrst wird die Textur auch verzerrt. Zeig doch mal deinen Fragment Shader.

Zur Veranschaulichung hab ich gerade mal was hingeschmiert:


(Link)

23

22.07.2012, 19:11

FragmentShader:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
#version 330 core

in vec2 UV;
// Ouput data
out vec3 color;
uniform sampler2D myTextureSampler;

void main() {
    color = texture2D( myTextureSampler, UV ).rgb;
}


Danke für das Bild. Hat mir für die Erklärung geholfen :).

MfG
Delop

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

24

22.07.2012, 19:15

Ok, der Fragmentshader sieht soweit gut aus. Liegt wohl an deiner Transformation.

25

22.07.2012, 19:31

Ok. Es dreht sich nicht mehr unten an der Mitte von der Kante sondern um 0|0 glaube ich.

Kann hier der Fehler sein? Es gilt myPos.x = myPos.y = 0; mySize.x = mySize.y = 1

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
A.x = myPos.x;
A.y = myPos.y;
B.x = myPos.x;
B.y = myPos.y + mySize.y;
C.x = myPos.x + mySize.x;
C.y = myPos.y;
D.x = myPos.x + mySize.x;
D.y = myPos.y + mySize.y;

// Vertex
static const GLfloat vertex[] = {
    A.x, A.y, 0.f,
    B.x, B.y, 0.f,
    C.x, C.y, 0.f,
    D.x, D.y, 0.f,
};

// UVs
static const GLfloat uvs[] = {
    0.0, 0.0,
    0.0, 1.0,
    1.0, 0.0,
    1.0, 1.0, 
};


MfG

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

26

22.07.2012, 19:49

Du kannst übrigens auch einen vec2 senden, dann brauchst du kein 0.f mehr. Und daran kann es eigentlich nicht liegen.
Ist die Fläche denn nur einen Pixel breit/hoch? Sind wir gerade bei 2D oder 3D?
Wenn es 2D ist und es ist nur einen Pixel hoch kann es sein das man dies einfach nicht sieht.

27

22.07.2012, 19:52

Alles ist gerade 2D. Nein, die Textur ist 1024 x 1024 breit/hoch und das Fenster 800 x 600, aber die Textur wird nur 256 x 256 breit und hoch angezeigt.

MfG
Delop

28

22.07.2012, 20:09

Na toll...mit einer Projektionsmatrix geht es nicht mehr :/.

C-/C++-Quelltext

1
2
mat4 P;
P.ortho(0, 800, 0, 600, 0.1, 100);
Diese habe ich dann mit MVP multipliziert und dann an den Shader übergeben, aber nichts ist zu sehen.

MfG
Delop

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

29

22.07.2012, 20:12

Hast du in der richtigen Reihenfolge multipliziert? Also Projektion*Modelview? Ist die größe deines Fensters 800x600?
Es ist nicht so einfach dir von hier zu helfen ^^

Aber so sieht z.B. meine Rendermethode aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
shader->bindShader();
            shader->sendUniform4x4("pm", (projection*modelview).getArray());
            shader->sendUniform("texture0", 0);
                            
            glActiveTexture(GL_TEXTURE0);
            glBindTexture(GL_TEXTURE_2D, texture->getTextureID());

            shader->enableVertexAttribArrays();
                                
            glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
            glVertexAttribPointer(shader->getAttribLocation("vertex0"), 2, GL_FLOAT, GL_FALSE, 0, 0);               
            glBindBuffer(GL_ARRAY_BUFFER, m_texCoordBuffer);
            glVertexAttribPointer(shader->getAttribLocation("texCoord0"), 2, GL_FLOAT, GL_FALSE, 0, 0);
            
            glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, &m_indices[0]);
            
            shader->disableVertexAttribArrays();


Ich hab allerdings eine Klasse für die Shader. Wenn du die auch haben willst sag bescheid.

30

22.07.2012, 20:19

Danke, aber ich habe schon meine Ansammlung an Funktionen für Shaders :).

Für alle deine Fragen, die Antwort: Ja.

MfG
Delop

Werbeanzeige