Таким образом, вопрос заключается в следующем: когда я переключаюсь с ColorPointers на Textures, кажется, что эффекты молнии / тени значительно уменьшаются.Некоторое решение, которое я нашел, но не сделал этого, это настройка glLightModeli (GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR).Могу ли я сделать что-нибудь еще, чтобы получить эффекты, более близкие к тому, что я получил бы без текстур?
Вот как я запускаю мои огни / сцену:
glClearColor (0.0, 0.0, 0.0, 0.5); # Black Background
glClearDepth (1.0); # Depth Buffer Setup
glDepthFunc(GL_LEQUAL) # The Type Of Depth Testing
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH); # Select Smooth Shading
glColor4f(0.90, 6.0, 6.0, 1.0)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
#glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0)
glEnable(GL_COLOR_MATERIAL);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, [0.7, 0.7, 0.7, 0])
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, [0.8, 0.8, 0.7, 0])
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, [0.8, 0.8, 0.8, 0])
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, 30)
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glLightModeli( GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR );
glLightfv(GL_LIGHT0, GL_POSITION, [0.85, 0.8, 0.75, 0])
glLightfv(GL_LIGHT0, GL_AMBIENT, [0.8, 0.8, 0.7, 0])
glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.7, 0.7, 0.7, 0])
glLightfv(GL_LIGHT0, GL_SPECULAR, [0.8, 0.8, 0.8, 0])
И для фактического рисунка.
glEnableClientState(GL_VERTEX_ARRAY)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices)
glVertexPointer(3, GL_FLOAT, 0, None)
glEnableClientState(GL_NORMAL_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals)
glNormalPointer(GL_FLOAT, 0, None)
#glEnableClientState(GL_COLOR_ARRAY)
#glColorPointer(3, GL_FLOAT, 0, None)
glEnableClientState(GL_TEXTURE_COORD_ARRAY)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferTextureIndex)
glTexCoordPointer(1, GL_FLOAT, 0, None);
glBindTexture(GL_TEXTURE_1D, self.texture)
glEnable(GL_TEXTURE_1D)
glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, ADT.voidDataPointer(self.triangles))
Для цветов каждой вершины я использовалнормали как фиктивные цвета, так как это был всего лишь шаг на пути интеграции текстур.Текстура является самогенерируемой, в основном значения:
def getColor(self, value):
if value < 0:
return [1, 0, 0]
if value >=0 and value < 0.8:
return [1, 0.5, 0]
if value >= 0.8 and value < 1:
return [1, 1, 0]
if value >=1 and value < 1.2:
return [0.5, 1, 0]
if value >=1.2 and value < 1.4:
return [0, 1, 0]
if value >= 1.4 and value < 1.6:
return [0, 1, 0.5]
if value >= 1.6 and value < 1.8:
return [0, 1, 1]
if value >= 1.8 and value < 2:
return [0, 0.5, 1]
if value >= 2:
return [0, 0, 1]
Фактическое создание:
glBindTexture(GL_TEXTURE_1D, self.texture)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 190, 0, GL_RGB , GL_FLOAT, textureArray)
С уважением, Богдан
РЕДАКТИРОВАТЬ
Хорошо, я приблизился к желаемому эффекту, но это было просто попыткой различных комбинаций glColor4f с материалами и светом в следующей части.
glColor4f(2.2, 2.2, 2.2, 1.0)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0)
glEnable(GL_COLOR_MATERIAL)
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, [0.6, 0.6, 0.6, 1.0])
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, [0.6, 0.6, 0.6, 1.0])
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, [0.8, 0.8, 0.8, 1.0])
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, 30)
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
glLightModeli( GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR )
glLightfv(GL_LIGHT0, GL_POSITION, [0, -10, -400, 0])
glLightfv(GL_LIGHT0, GL_AMBIENT, [0, 0, 0, 0])
glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.7, 0.7, 0.7, 0])
glLightfv(GL_LIGHT0, GL_SPECULAR, [0.8, 0.8, 0.8, 0])
Существует ли какая-то формула того, как все это (glColor4f + Материалы + Свет + Текстура) влияет на окончательные эффекты цвета / тени / блеска?