?
if(PerspectiveProperties::Lighting)
{glEnable(GL_LIGHTING);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, PerspectiveProperties::GeneralAmbientLight);
glEnable(GL_COLOR_MATERIAL);
Könnte eventuell daran liegen. Man muss den Status eigentlich nur 1x einschalten und nicht jeden Frame. Frag doch mal den Status von Lightning ab und aktiviere nur wenn nötig. Ansonsten frag doch mal am ENDE jedes Frames den Error-Code ab und lass dir den ausgeben über Visual Studio. Das hilft oft ne Menge. So mach ich das:
u32 err = glGetError();
while (err != GL_NO_ERROR && err != m_prevGLError)
{
m_prevGLError = err;
std::stringstream ss;
ss << "Error No:" << this->getGLErrorString(err) << "!";
NLTrace(ss.str().c_str());
err = glGetError();
}
Zu den Texturen:
Wenn man eine Textur nicht mit BGRA lädt und diese keinen Alpha-Kanal hat, sollte das so nicht funktionieren, aber das ist von hier aus schlecht zu sagen.
Ich benutze halt eine Image-Library und frage das Format des Bildes ab und erzeuge danach die Textur mit dem korrekten Parameter:
NLITexture* NLTextureLoader::getTexture(const char* name, const char* filename, const bool repeat)
{
if ( !glIsEnabled(GL_TEXTURE_2D) ) {
glEnable(GL_TEXTURE_2D);
}
// Load Texture
corona::Image* img = NULL;
img = corona::OpenImage(filename, corona::PF_R8G8B8A8);
if (!img)
{
NLError(std::string("Cannot load Image '") + name + std::string("'."));
return NULL;
}
u32 id = this->makeGLTexture(img->getPixels(), img->getWidth(), img->getHeight(), getColorsFromFormat(img->getFormat()), repeat);
delete img;
// Add to collection
NLTexture *handle
= new NLTexture(name, id);
return handle;
}
u32 NLTextureLoader::makeGLTexture(void* data, const u32 width, const u32 height, const u32 numcolor, const bool repeat)
{
GLuint glImage = 0;
GLint oldTexture = 0;
u32 mode = GL_TEXTURE_2D; // GL_EXT_texture_rectangle
glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldTexture);
glGenTextures(1, &glImage);
glBindTexture(mode, glImage);
if ( numcolor == 3 )
{
glTexImage2D(mode, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
}
else if ( numcolor == 4)
{
glTexImage2D(mode, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
}
if ( repeat == true )
{
glTexParameteri(mode, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(mode, GL_TEXTURE_WRAP_T, GL_REPEAT);
}
else
{
glTexParameteri(mode, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(mode, GL_TEXTURE_WRAP_T, GL_CLAMP);
}
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(mode, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(mode, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, oldTexture);
return glImage;
}
u32 NLTextureLoader::getColorsFromFormat(u32 value)
{
switch(value)
{
case corona::PF_R8G8B8:
return 3;
case corona::PF_B8G8R8:
return 3;
case corona::PF_B8G8R8A8:
return 4;
case corona::PF_R8G8B8A8:
return 4;
default:
return 3;
}
}
HTH.
rya.