[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] GLSL Texturing example ? (and ctypes...?)



Exellent Alex, thank you!

Jon


Quoting Alex Holkner <aholkner@xxxxxxxxxxxxxx>:

> JoN wrote:
> 
> >Sorry I should have clarified.
> >
> >I got that demo working fine, but then tried to modify it to do texturing
> and
> >didn't get very far.
> >What I am having problems with is the operations to set the active texture.
> >I've been using some NeHe demo code to bind 2D textures just fine and have
> been
> >happily texturing quads using python opengl.
> >
> >However, I am new to ctypes, which does really look like the way to go.
> >  
> >
> Here's a modification to the first GLSL (coloured teapot, GL 1.5/2.0) 
> example.
> 
> To load the texture data (nothing GLSLy or ctypesy here): (make sure 
> your texture dimensions are powers of 2)
> 
>     import pygame.image
>     image = pygame.image.load('kitten.png')
>     glEnable(GL_TEXTURE_2D)
>     texture = glGenTextures(1)
>     glBindTexture(GL_TEXTURE_2D, texture)
>     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
>                  image.get_width(), image.get_height(),
>                  0, GL_RGBA, GL_UNSIGNED_BYTE,
>                  pygame.image.tostring(image,'RGBA', True))
>     glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
>     glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
> 
> Get two more functions out of libGL using ctypes:
> 
>     glGetUniformLocation = gl.glGetUniformLocation
>     glUniform1i = gl.glUniform1i
> 
> Add a uniform sampler2D to the fragment shader, and make it modulate the 
> colour with the texture:
>     // Fragment program
>     varying vec3 pos;
>     uniform sampler2D texture;
>     void main() {
>         gl_FragColor.rgb = pos.xyz * tex2D(texture, gl_TexCoord[0].xy).rgb;
>     }
> 
> The vertex program needs to pass the texture coordinates through: 
> (should multiply by the texture matrix here, but we don't care about that)
>     // Vertex program
>     varying vec3 pos;
>     void main() {
>         pos = gl_Vertex.xyz;
>         gl_TexCoord[0] = gl_MultiTexCoord0;
>         gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
>     }
> 
> Get the location of the uniform sampler2D in Python (if it's -1, you've 
> done something wrong).
>     texture_param = glGetUniformLocation(program, "texture");
> 
> Set the sampler to use the first texture unit (0):
>     glUseProgram(program)
>     glUniform1i(texture_param, 0);
>     glutSolidTeapot(1.0)
> 
> One kittened teapot.
> 
> Alex.
> 
> 
> 




--------------------------------------------------------------------
Come and visit Web Prophets Website at http://www.webprophets.net.au