OpenGL - Как текстурирование влияет на тени / молнии? - PullRequest
2 голосов
/ 09 июня 2011

Таким образом, вопрос заключается в следующем: когда я переключаюсь с 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 + Материалы + Свет + Текстура) влияет на окончательные эффекты цвета / тени / блеска?

1 Ответ

1 голос
/ 09 июня 2011

Если вы используете свой шейдер в своем другом вопросе здесь Вопросы о шейдерах OpenGL

, тогда ответ заключается в том, что вы не обрабатываете освещение в своем шейдере, которое отключает процедуры освещения с фиксированной функцией, когдавы активируете свой шейдер.

Если я подскакиваю из-за этого заключения и вы видите вещь без шейдера, я прошу прощения.

Редактировать

Да, естьформула.Он подробно описан в оранжевой книге и кратко в красной книге http://glprogramming.com/red/chapter05.html. Более старая версия свободно доступна для красной книги.

В основном это зависит от текстуры объекта, если естьцвет и как он применяется, модулируется, добавляется, умножается.Материал и то, как он отражает огни разных цветов, плюс любые выбросы, которые создает материал (подумайте, свечение в темном материале стикера для излучения), а также цвет света и угол, под которым свет падает на лицо.«Блестящий» происходит от зеркального отражения света.

...