2012-01-28 3 views
1

Мне показалось, что я работал, но я все еще не могу понять, как изменить значение в моем вершинном шейдере. Что мне делать в OpenGL заключается в следующем, для каждого рендеринга:change float in vertex shader (GLSL)

//i bind my shader 
shader.bind(); 

// Then trying to set the value in my vertex shader like so: 
GLuint test = glGetUniformLocation(shader.id(), "Test"); 
glUniform1f(test, 6.0f); 

// Do some other stuff like rendering an object 
// ... 

// then unbind shader 
shader.unbind(); 

Это значение я хочу изменить в моей вершинных шейдеров:

uniform float Test = 0.66; // Doesn't work 
//const float Test = 0.66; // Works 

Но мой затенение не работает, когда я пытаюсь что он делает мой объект черным.

Если я комментировать glGetUniform (Location) части, и если использовать поплавок как сопзИте вместо униформы тогда мой шейдер работает отлично. Но я хочу, чтобы иметь возможность изменять значение в моем шейдере в каждом рендеринге. Я, хотя я должен был использовать форму для этого ...?

Есть ли что-то, что мне не хватает .. ??


EDIT:

Appearently я получаю следующее сообщение об ошибке: GLSL

non constant expression in initialization

Так должно быть постоянным для того, чтобы работать ... Означает ли это, что не существует способ иметь это как динамическое значение ..?

Это мой Vertex Shader:

const float FresnelPower = 1.0; 
uniform float Eta;   // <---- MUST BE CONSTANT... 

const float F = ((1.0-Eta) * (1.0-Eta))/((1.0+Eta) * (1.0+Eta)); 

varying vec3 Reflect; 
varying vec3 Refract; 
varying float Ratio; 

void main() 
{ 
    vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex; 
    vec3 ecPosition3 = ecPosition.xyz/ecPosition.w; 

    vec3 i = normalize(ecPosition3); 
    vec3 n = normalize(gl_NormalMatrix * gl_Normal); 

    Ratio = F + (1.0 - F) * pow((1.0 - dot(-i, n)), FresnelPower); 

    Refract = refract(i, n, Eta); 
    Refract = vec3(gl_TextureMatrix[0] * vec4(Refract, 1.0)); 

    Reflect = reflect(i, n); 
    Reflect = vec3(gl_TextureMatrix[0] * vec4(Reflect, 1.0)); 

    gl_Position = ftransform(); 
} 

ответ

1

Вы должны объявить вашу форму в вершинном шейдере, как это:

uniform float Test; 

Кроме того, вы должны позвонить glUseProgram() с программой объекта ручки перед вызовом glUniform1f(), поэтому убедитесь, что это то, что делает ваш shader.bind(). Этого достаточно, если вы вызываете glGetUniformLocation() один раз и кэшируете результат. Также проверьте ошибки своих вызовов OpenGL с помощью glGetError(), чтобы все остальное работало правильно.

Ответ на ваши изменения, я думаю, что эта линия ваша проблема:

const float F = ((1.0-Eta) * (1.0-Eta))/((1.0+Eta) * (1.0+Eta)); 

const средство компиляция постоянного время, как, значение не может быть изменено формой. F не может быть константой, поскольку равномерная переменная не является константой (время компиляции). Переместите строку, объявляющую F, на тело main и удалите классификатор const. Тогда ваш шейдер должен работать.

+0

Я попробовал то, что вы сказали, я проверил с помощью glGetError(), и это дало мне ошибку, когда я попытался связать шейдер (glUserProgram). Я отлаживал еще немного и заметил, что у меня возникла ошибка компиляции glsl. Я опубликовал свой первый пост с более подробной информацией. Может быть, вы знаете ответ на этот вопрос? – w00

1
uniform float Eta;   // <---- MUST BE CONSTANT... 

Когда GLSL говорит "константа", что значит это время компиляции константа. Значение Eta, безусловно, равномерно в пределах конкретного вызова вызова. Но он не является постоянным, потому что он может изменить между вызовами рисования. Компилятор не знает, какое это значение будет во время компиляции.

A const переменная время компиляции постоянная. Поэтому он должен быть инициализирован выражением, состоящим только из констант времени компиляции. uniform s не являются константами времени компиляции, поэтому вы не можете инициализировать переменную const с ними.

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