[C++] OpenGL: textures en kleuren toepassen bijt elkaar

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • flok
  • Registratie: April 2003
  • Laatst online: 11-03-2023

flok

www.vanheusden.com

Topicstarter
Hi,

Ik zit wat te experimenteren met OpenGL en stuit op het volgende probleem: ik een quad en een paar vertexen. De quad heeft een texture, de vertexen een kleur. Als ik nu alleen de quad met die texture doe, dan gaat dat goed. Doe ik echter daarna een vertex met als kleur rood, dan verandert de kleur van de quad opeens ook in roodtinten! En dat ondanks glBegin/glEnd.
Het valt me trouwens op dat glLineWidth ook niet werkt.
Hoe los ik dit op?

C++:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <SDL/SDL_image.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>

SDL_Surface *img = IMG_Load("basictexture.png");
double near = 1.0, far = 600.5;
double angle = 60;
int w = 640, h = 480;
GLuint texture = (GLuint)-1;

#define EC() ec(__LINE__)
void ec(int line) // error check
{
    GLint err = glGetError();
    if (err != GL_NO_ERROR) printf("GL error @ %d: %d/%x\n", line, err, err);
}

void redraw(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);
    EC();
    glBegin(GL_QUADS);
    double d = -420;
    glTexCoord2f(0.0, 0.0);
    glVertex3f(-320.0, -240.0, d);
    glTexCoord2f(1.0, 0.0);
    glVertex3f(320.0, -240.0, d / 2);
    glTexCoord2f(1.0, 1.0);
    glVertex3f(320.0, 240.0, d);
    glTexCoord2f(0.0, 1.0);
    glVertex3f(-320.0, 240.0, d / 3);
    glEnd();
    EC();
    glDisable(GL_TEXTURE_2D);
    EC();

    glBegin(GL_LINES);
// werkt niet   glLineWidth(100.0);
    glColor3d(1.0, 0.0, 0.0);
    glVertex3d(-320, 0, d+5);
    glVertex3d(320, 0, d+5);
    glEnd();

    glutSwapBuffers();
}

int main(int argc, char *argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(w, h);
    glutCreateWindow("My first GLUT program");
    EC();

    glEnable(GL_TEXTURE_2D);
    EC();

    glutDisplayFunc(redraw); 
    glutIdleFunc(redraw); 
    EC();

    glMatrixMode(GL_PROJECTION);
    EC();
    glLoadIdentity();
    EC();
    gluPerspective(angle, //view angle
            (double)w/(double)h, //aspect ratio
            near, //near clip
            far);//far clip
    EC();

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    EC();
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    EC();
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    EC();
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    EC();
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    EC();
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img -> w, img -> h, 0, GL_RGB, GL_UNSIGNED_BYTE, img -> pixels);
    EC();
    glDisable(GL_TEXTURE_2D);
    EC();

    glutMainLoop();

    return 0;
}

[ Voor 0% gewijzigd door BtM909 op 08-02-2012 12:06 ]

www.vanheusden.com


Acties:
  • 0 Henk 'm!

  • Wolfos
  • Registratie: Oktober 2010
  • Laatst online: 11-09 23:02
Kan iets te maken hebben met dat vertex colours gradient overlopen? En waarom gebruik je GLUT als je toch SDL gebruikt?

Acties:
  • 0 Henk 'm!

  • boreus
  • Registratie: December 2011
  • Laatst online: 13-08 08:35
Volgens mij doet de standaard texture pijplijn een modulate (componentsgewijs vermenigvuldigen) met de glColor die je hebt ingesteld. Voordat je je texture rendert, kan je deze dus het beste op (1,1,1) zetten. Een andere optie is om met glTexEnvXX [1] de modulate instelling te wijzigen.

[1] http://www.opengl.org/sdk/docs/man/xhtml/glTexEnv.xml

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Dit is trouwens allemaal deprecated opengl; ik raad je aan om je in te lezen in opengl 3.2 en later. (ik weet niet of je ogl aan het leren bent, maar het is gewoon zonde om de oude fixed pipeline te leren als die al afgeschaft is en alleen nog voor backward compatibility wordt aangeboden)

[ Voor 48% gewijzigd door Zoijar op 07-02-2012 21:08 ]


Acties:
  • 0 Henk 'm!

  • flok
  • Registratie: April 2003
  • Laatst online: 11-03-2023

flok

www.vanheusden.com

Topicstarter
En waarom gebruik je GLUT als je toch SDL gebruikt?
Ik vond al googlend meer info over glut dan sdl. Ik bouw 't tzt wel om naar puur SDL.

www.vanheusden.com


Acties:
  • 0 Henk 'm!

  • flok
  • Registratie: April 2003
  • Laatst online: 11-03-2023

flok

www.vanheusden.com

Topicstarter
Volgens mij doet de standaard texture pijplijn een modulate (componentsgewijs vermenigvuldigen) met de glColor die je hebt ingesteld. Voordat je je texture rendert, kan je deze dus het beste op (1,1,1) zetten. Een andere optie is om met glTexEnvXX \[1] de modulate instelling te wijzigen.
Inderdaad dat werkt! Dat had ik niet gedacht. Dus een kleur-wijziging werkt met terugwerkende kracht als je bij een texture niet een kleur zet?
Bedankt!

www.vanheusden.com


Acties:
  • 0 Henk 'm!

  • flok
  • Registratie: April 2003
  • Laatst online: 11-03-2023

flok

www.vanheusden.com

Topicstarter
Dit is trouwens allemaal deprecated opengl; ik raad je aan om je in te lezen in opengl 3.2 en later. (ik weet niet of je ogl aan het leren bent, maar het is gewoon zonde om de oude fixed pipeline te leren als die al afgeschaft is en alleen nog voor backward compatibility wordt aangeboden)
Mja, dit is wat ik vind als ik google op dingen als "opengl example" e.d. en daar moet ik 't in 1e instantie ook va n hebben. Ik ben pas op blz.3 van dat te dikke opengl boek.

www.vanheusden.com


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

flok schreef op dinsdag 07 februari 2012 @ 21:52:
Mja, dit is wat ik vind als ik google op dingen als "opengl example" e.d. en daar moet ik 't in 1e instantie ook va n hebben. Ik ben pas op blz.3 van dat te dikke opengl boek.
Tsja, daarom waarschuw ik dus dat dit oud opengl is dat eigenlijk niet meer voor nieuwe projecten gebruikt zou moeten worden. Je leert nu dus allemaal (soon-to-be) irrelevante dingen, want de fixed pipeline bestaat niet meer. Die hele pipeline is er uit. glBegin bestaat niet meer, glMatrixMode niet, glColor, glVertex. Het werkt alleen nog om oude code niet te breken. Je kan beter hier bijvoorbeeld beginnen: http://www.opengl.org/wiki/Tutorials#OpenGL_3.2_Core_Profile

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Even iets anders:
Gebruik a.u.b. de edit knop ( Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/edit.gif ) als je iets toe te voegen hebt; je topic herhaaldelijk omhoogschoppen is niet nodig en die melding staat er niet voor niets:

Afbeeldingslocatie: http://tweakers.net/ext/f/93OGDVn8zio6RrIck1qYj8ne/full.png

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:29

.oisyn

Moderator Devschuur®

Demotivational Speaker

flok schreef op dinsdag 07 februari 2012 @ 21:51:
[...]


Inderdaad dat werkt! Dat had ik niet gedacht. Dus een kleur-wijziging werkt met terugwerkende kracht als je bij een texture niet een kleur zet?
Je zet helemaal geen kleur bij een texture. Elke vertex heeft een kleurcomponent en met glColor verander je de interne vertex color state die gebruikt zal worden bij elke volgende glVertex. Hetzelfde verhaal geldt voor glTexCoord. De eerste keer dat redraw() wordt aangeroepen zal het goed gaan omdat de interne kleur dan nog wit is. Maar tegen het eind van die functie verander je de kleur, en daar blijft ie ook op staan voor alle volgende frames.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1