2013-03-12 3 views
0

Как настроить opengl shininess float, поэтому я могу использовать его в шейдерной программе с gl_FrontMaterial.shininess?Настройка блеска для glsl

Я пробовал это glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 100f);, но основные моменты не становятся меньше, поэтому я думаю, что синины не меняются.

Edit: Это программа пиксельный шейдер, где я использую его:

varying vec4 varyingColor; 
varying vec3 varyingNormal; 
varying vec4 varyingVertex; 
varying vec2 varyingTexCoord; 
uniform sampler2D my_color_texture; 
varying vec3 varyingEyeVec; 

void main() { 
    vec3 vertexPosition = (gl_ModelViewMatrix * varyingVertex).xyz; 
    vec3 surfaceNormal = normalize((gl_NormalMatrix * varyingNormal).xyz); 
    vec3 lightDirection = normalize(gl_LightSource[0].position.xyz - vertexPosition); 
    float diffuseLightIntensity = max(0, dot(surfaceNormal, lightDirection)); 
    gl_FragColor.rgb = diffuseLightIntensity * varyingColor.rgb; 
    gl_FragColor += gl_LightModel.ambient; 
    vec3 reflectionDirection = normalize(reflect(lightDirection, surfaceNormal)); 
    vec3 eyeVecNormal = normalize(varyingEyeVec); 
    float specular = max(0.0, dot(eyeVecNormal, reflectionDirection)); 
    if (diffuseLightIntensity != 0) { 
     float fspecular = pow(specular, gl_FrontMaterial.shininess)*gl_LightSource[0].specular.rgb; 
     gl_FragColor += fspecular; 
    } 
    gl_FragColor = texture2D(my_color_texture, varyingTexCoord)*gl_FragColor; 
} 
+1

Почему вы используете фиксированную функцию, традиционно встроенную в идентификаторы? Они исчезли и незаконны для использования в более поздних версиях OpenGL (ядро OpenGL-3 и последнее). Просто используйте индивидуальную форму. – datenwolf

+0

Что именно вы говорите? – Qualphey

+0

Вы говорите о встроенной переменной GLSL gl_FrontMateral? – Qualphey

ответ

4

Вы не должны использовать встроенные, наследие OpenGL переменные. Они устарели и делают ваши шейдеры несовместимыми с более поздними версиями OpenGL.

Когда вы используете шейдеры, вы используете шейдеры. Весь смысл шейдеров - избавиться от состояния фиксированной функции и ее API. Ядро OpenGL-3 удалило весь API конвейера с фиксированной функцией, включая glMaterial….

Вместо этого определите всю форму, в которой вы нуждаетесь. Также ваш код выглядит как смесь вершинного шейдера и фрагментарного шейдера. Весь этот материал преобразования матрицы принадлежит вершинному шейдеру. Выполнение этого в фрагмент-шейдере является пустой тратой драгоценных циклов вычисления.

+0

Можете ли вы дать мне пример определения всех мундиров и настройки блеска с помощью процессора? – Qualphey

+0

вы могли бы дать мне некоторые ресурсы об этом – Qualphey

+4

@visDEVion: Я рекомендую вам работать с учебником по современному OpenGL. Nicol Bolas 'отлично, вы можете найти его на http://arcsynthesis.org/gltut - он также подробно объясняет, как использовать шейдеры в современном, будущем пути доказательства. – datenwolf

Смежные вопросы