2
votes

I am trying to create a normal map in opengl that I can load into the shader and change dynamically, though currently i am stuck at how to create the texture.

I currently have this:

glActiveTexture(GL_TEXTURE7);
glGenTextures(1, &normals);
glBindTexture(GL_TEXTURE_2D, normals);
texels = new Vector3f*[256];

for(int i = 0; i < 256; ++i){
    texels[i] = new Vector3f[256];
}
this->setup_normals();

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_FLOAT, texels);

...

void setup_normals(){
for(int i = 0; i < 256; ++i){
        for(int j = 0; j < 256; ++j){
            texels[i][j][0] = 0.0f;
            texels[i][j][1] = 1.0f;
            texels[i][j][2] = 0.0f;
        }
    }
}

where Vector3f is: typedef float Vector3f[3];

and texels is: Vector3f** texels;

When I draw this texture to a screenquad using an orthogonal matrix( which works for textures loaded in) I get this.

I am unsure why it does not appear fully green and also what is causing the black streaks to appear within it. Any help appreciated.

1

1 Answers

1
votes

Your array needs to be contiguous since glTexImage2D() doesn't take any sort of stride or row mapping parameters:

texels = new Vector3f[256*256];