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

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

1

23.12.2012, 10:47

[Gelöst] Problem mit 3D-Texturen: Komische Darstellung

Hallo allerseits,
ich hab mal wieder ein Problem, und zwar wie auf folgendem Bild zu sehen:

(Link)

Ich versuche, das bild in ein Texture2DArray zu laden und dann einen Texturatlas daraus zu machen. Aber leider stimmt irgendetwas (wahrscheinlich mit den Texturkoordinaten) nicht.

hier der Code zur erstellung der Texturkoordinaten:

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
39
void StaticChunk::createRenderObject(const ivec2 & offset)
{
    int count = 0;
    uint id;
    int index = 0;
    float layer = 0;

    fvec3    coords[(chunksize*chunksize)*2*3];
    fvec3 texcoords[(chunksize*chunksize)*2*3];
    for(int x = 0; x<chunksize; x++)
    {
        for(int y = 0; y<chunksize; y++)
        {
            id = (*this)[(ivec2(x,y))].id;
            layer = float(getGlobalTileSet()->getPrototype(id)->layer);
            coords[index] = fvec3(offset.x+x,offset.y+y,0);
            texcoords[index] = fvec3(0.f, layer, 0.f);

            coords[index+1] = fvec3(offset.x+x+1,offset.y+y,0);
            texcoords[index+1] = fvec3(1.f, layer, 1.f);

            coords[index+2] = fvec3(offset.x+x+1,offset.y+y+1,0);
            texcoords[index+2] = fvec3(1.f, layer, 1.f);


            coords[index+3] = fvec3(offset.x+x+1,offset.y+y+1,0);
            texcoords[index+3] = fvec3(1.f, layer, 1.f);

            coords[index+4] = fvec3(offset.x+x,offset.y+y+1,0);
            texcoords[index+4] = fvec3(0.f, layer, 1.f);

            coords[index+5] = fvec3(offset.x+x,offset.y+y,0);
            texcoords[index+5] = fvec3(0.f, layer, 0.f);
            index += 6;
        }
        renderObject.setGeo(coords);
        renderObject.setTextureCoords(texcoords);
    }
}


Ich weis nicht mehr, woran es liegen soll...

MfG,
RmbRT
"Dumm ist, wer dummes tut."

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »RmbRT« (01.01.2013, 03:33)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

23.12.2012, 11:18

Debugger. Werte anschauen. Aufmalen. Nachdenken.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

23.12.2012, 11:20

Wieso packst du layer in die y-Koordinate? Wie genau samplest du die Textur im PixelShader?

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

4

27.12.2012, 15:45

also ich hatte erst layer in die z-Koordinate, aber da sah es genau so aus. und dann bin ich hier drüber gestolpert: "The layer used is specified using the "t" or "r" texture coordinate for 1D and 2D array textures, respectively."
naja, hier der shader:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#version 150 core

precision highp float;

uniform sampler2DArray texture_color;

in vec3 pass_texCoord;

out vec4 out_Color;

void main(void)
{
     vec4 color = texture2DArray(texture_color, pass_texCoord);
     
     out_Color = color;
}

Aber das hat halt auch nicht geholfen. An den Texturkoordinaten dürfte aber ansonsten alles stimmen, weil mit normalen 2d-texturen funktioniert es richtig.
Hatte schon mal jemand so ein problem mit 3d-texturen (oder auch 2d-texturarrays)?

MfG,
RmbRT
"Dumm ist, wer dummes tut."

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

27.12.2012, 16:15

Mir ist keine API, Shadersprache, Extension oder sonst was bekannt, wo nicht die letzte Koordinate den Array Layer bestimmt. Weder GLSL noch die von dir genannte EXT_texture_array (verwendest du die denn?) sind da eine Ausnahme...

Zitat von »http://www.opengl.org/registry/specs/EXT/texture_array.txt«

Syntax:

vec4 texture2DArray(sampler2DArray sampler, vec3 coord
[, float bias])
vec4 texture2DArrayLod(sampler2DArray sampler, vec3 coord,
float lod)
Description:

Use the first two elements (coord.s, coord.t) of texture coordinate coord
to do a texture lookup in the layer indicated by the third coordinate
coord.p of the 2D texture array currently bound to sampler. The layer to
access is computed by layer = max (0, min(d - 1, floor (coord.p + 0.5))
where 'd' is the depth of the texture array.

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

6

28.12.2012, 11:42

so hatte ich es ja auch erst gemacht, sah genau so komisch aus. Ich habe keine Ahnung, was ich da machen könnte :S
MfG,
RmbRT
"Dumm ist, wer dummes tut."

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

28.12.2012, 14:30

Zeig mal den Vertex Shader und wie du die Daten an OpenGL übergibst, ich könnte mir vorstellen, dass du dort z.B. einen falschen Stride angibst oder sowas...

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

8

01.01.2013, 03:32

Jetzt hab ichs:
in der funktion renderObject.setTextureCoords war noch von size auf 2 gelassen. also

C-/C++-Quelltext

1
glVertexAttribPointer(TexCoordAttribLocation, 2, GL_FLOAT, GL_FALSE, 0, 0);

Danke für den Tipp :D

MfG,
RmbRT
"Dumm ist, wer dummes tut."

Werbeanzeige