Шейдеры не работают должным образом

Использование OpenGL 3.2/GLSL 150 с OpenFrameworks v0.8.3

Я пытаюсь внедрить шейдеры в свои программы. Моя программа успешно загружает правильные файлы frag и vert, но я получаю этот сбой и ошибку:

введите здесь описание изображения

[ error ] ofShader: setupShaderFromSource(): GL_FRAGMENT_SHADER shader failed to compile
[ error ] ofShader: GL_FRAGMENT_SHADER shader reports:
ERROR: 0:39: Use of undeclared identifier 'gl_FragColor'

Я прочитал этот SO answer, объясняющий, что gl_FragColor не поддерживается в GLSL 300, но я (почти уверен, что я) не используя эту версию. Несмотря на это, когда я меняю gl_FragColor на переменную outputColor, мой экран просто становится черным без ошибок.

Почему мой шейдер не выглядит так, как ожидалось? У меня есть ощущение, что это либо мой файл .vert, либо фундаментальное непонимание того, как фигуры рисуются внутри шейдеров, либо проблемы с версиями.

Моя упрощенная программа:

.h

#pragma once

#include "ofMain.h" //includes all openGL libs/reqs
#include "GL/glew.h"
#include "ofxGLSLSandbox.h" //addon lib for runtime shader editing capability

class ofApp : public ofBaseApp{

public:
    void setup();
    void draw();

    ofxGLSLSandbox *glslSandbox; //an object from the addon lib
};

.cpp

#include "ofApp.h"
//--------------------------------------------------------------
void ofApp::setup(){
    // create new ofxGLSLSandbox instance
    glslSandbox = new ofxGLSLSandbox();

    // setup shader width and height
    glslSandbox->setResolution(800, 480);

    // load fragment shader file
    glslSandbox->loadFile("shader"); //shorthand for loading both .frag and .vert as they are both named "shader.frag" and "shader.vert" and placed in the correct dir
}
//--------------------------------------------------------------
void ofApp::draw(){
    glslSandbox->draw();
}

.vert (предполагалось, что это просто сквозной канал... если это имеет смысл)

#version 150

uniform mat4 modelViewProjectionMatrix;
in vec4 position;

void main(){
    gl_Position = modelViewProjectionMatrix * position;
}

.frag (см. 3-й интерактивный блок кода ниже этой страницы для предполагаемый результат)

#version 150

#ifdef GL_ES
    precision mediump float;
#endif

out vec4 outputColor;

uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time;

float circle(in vec2 _st, in float _radius){
    vec2 dist = _st-vec2(0.5);
    return 1.-smoothstep(_radius-(_radius*0.01),
                         _radius+(_radius*0.01),
                         dot(dist,dist)*4.0);
}

void main(){
    vec2 st = gl_FragCoord.xy/u_resolution.xy;
    vec3 color = vec3(circle(st,0.9));
    outputColor = vec4( color, 1.0 );
}

person A__    schedule 26.01.2016    source источник
comment
Где вы устанавливаете форму?   -  person Dietrich Epp    schedule 27.01.2016
comment
Ах я вижу. Я должен установить vars для передачи в шейдеры. Спасибо. Не стесняйтесь отвечать, иначе я сделаю это, как только разберусь.   -  person A__    schedule 27.01.2016


Ответы (1)


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

person Dietrich Epp    schedule 26.01.2016