2013-09-25 3 views
0

Я не уверен, что от того, что эта проблема, возникающая, я никогда не имел большого опыта работы с шейдерами, так что может быть не связан с фактическим шейдера (скорее всего, проблема заключается не в шейдере)GLSL шейдер мерцающий

у меня этот результат

enter image description here

Фрагмент шейдеры

#version 120 
void main(void) { 
    gl_FragColor[0] = 0.0; 
    gl_FragColor[1] = 0.0; 
    gl_FragColor[2] = 0.0; 
} 

Vertex шейдер

#version 120 
attribute vec2 coord2d; 

void main(void) { 
    gl_Position = vec4(coord2d, 0.0, 1.0); 
} 

Моя оказывать функцию

(define (renderFunc) 
    (gl:Clear gl:COLOR_BUFFER_BIT) 

    (gl:UseProgram program) 

    (gl:EnableVertexAttribArray attribute_coord2d) 

    (gl:Begin gl:TRIANGLES) 
    (gl:Vertex3f 0.0 0.8 0) 
    (gl:Vertex3f -0.8 -0.8 0) 
    (gl:Vertex3f 0.8 -0.8 0) 
    (gl:End) 

    (gl:DisableVertexAttribArray attribute_coord2d) 

    (glut:SwapBuffers)) 

И мои INIT функцию

(define (initFunc) 
    (gl:ClearColor 1 1 1 1) 

    (gl:Enable gl:TEXTURE_2D) 
    (gl:Enable gl:LIGHTING) 

    (gl:Enable gl:BLEND) 
    (gl:BlendFunc gl:SRC_ALPHA gl:ONE_MINUS_SRC_ALPHA) 

    (set! program (CreatePorgram (list 
     (CreateShader gl:VERTEX_SHADER (LoadScript "vs.glsl")) 
     (CreateShader gl:FRAGMENT_SHADER (LoadScript "vf.glsl"))))) 

    (set! attribute_coord2d (gl:GetAttribLocation program "coord2d")) 

    (print "attribute_coord2d: " attribute_coord2d) 
    (print "vbo_triangle: " vbo_triangle) 
    (print "program: " program) 

    (print (gl:GetError))) 

Не уверен точно, почему, но шейдер получает правильно и так далее загружен. glGetError не возвращает никаких ошибок, и все работает нормально.

я на основе моего кода на этом уроке, который компилируется и работает отлично на моей машине:

http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Introduction

У меня есть ощущение, что эта ошибка моей быть связано с моей схемы привязок. Когда шейдер привязан к памяти, мы можем освободить источник, отправленный в opengl. Я уверен, что исходный код для шейдера будет освобожден после создания шейдера.

Я довольно потерял, обнаружив, что в моем коде, что я по-другому, я слышал о glUniform, но я считаю, что в моем случае это не имеет большого значения.

Я использовал glBegin и glEnd, потому что у меня возникли проблемы с созданием VBOs. Если vbos является обязательным требованием, то я буду уверен, что он работает первым.

Кстати, мы должны видеть черный треугольник вместо треугольника черных точек.

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

enter image description here

+0

Вы случайно используете курицу с [аллегро яйцом] (http://wiki.call-cc.org/eggref/4/allegro/)? Трудно попытаться воспроизвести что-либо, не зная, с какой реализацией Scheme и с библиотеками вы работаете. –

+0

Я использую Chicken Scheme с модифицированной версией яйца Opengl, я могу подтолкнуть его к github позже сегодня. –

+0

@ ChrisJester-Young в случае, если вам это нравится, я добавил проект и свою работу на github https://github.com/llacroix/chicken-opengl-bindings, а другой проект называется чистотой. Я в основном переводил некоторые учебные пособия в Scheme, и я на самом деле не интриган, чтобы это выглядело как начало долгого путешествия. –

ответ

5

Может быть, что gl_FragColor является vec4, ожидая значение альфа. Смешение включено, но неинициализированные значения остаются в виде значения альфа-фрагмента, вызывающего мерцание?

Это исправление?

gl_FragColor = vec4(0,0,0,1); 

Причина, по которой мерцает это делать с тем, когда потоки (для выполнения фрагмента шейдер) запланированы. Потоки ветвей остаются в памяти, где местоположение альфа-значения просто имеет данные из предыдущей вещи, которую делал GPU.

+0

Удаление смешивания или добавление альфа-значения устраняло проблему. –

+0

Спасибо, я думаю, что вчера провел 5 или 6 часов, пытаясь выяснить, что происходит. –

+0

np. я знаю это чувство – jozxyqk

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