ubah float di vertex shader (GLSL)

Saya pikir saya sudah membuatnya berfungsi tetapi saya masih tidak tahu cara mengubah nilai di vertex shader saya. Apa yang saya lakukan di opengl adalah sebagai berikut, untuk setiap render:

//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();

Ini adalah nilai yang ingin saya ubah di vertex shader saya:

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

Tetapi shader saya tidak berfungsi ketika saya mencobanya, itu membuat objek saya menjadi hitam.

Jika saya mengomentari bagian glGetUniform(Location) dan jika menggunakan float sebagai const alih-alih < kuat>seragam maka shader saya berfungsi dengan baik. Tapi saya ingin bisa mengubah nilai shader saya di setiap render. Kupikir aku harus menggunakan seragam untuk itu...?

Apakah ada sesuatu yang saya lewatkan..??


EDIT:

Tampaknya saya mendapatkan kesalahan GLSL berikut:

ekspresi tidak konstan dalam inisialisasi

Jadi harus konstan agar bisa berfungsi... Apakah itu berarti tidak ada cara untuk menjadikan ini sebagai nilai dinamis..?

Ini adalah Vertex Shader saya:

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();
}

person w00    schedule 28.01.2012    source sumber


Jawaban (2)


Anda harus mendeklarasikan seragam Anda di vertex shader seperti ini:

uniform float Test;

Selain itu, Anda harus memanggil glUseProgram() dengan pegangan objek program Anda sebelum memanggil glUniform1f(), jadi pastikan itulah yang dilakukan shader.bind() Anda. Cukup jika Anda memanggil glGetUniformLocation() sekali dan menyimpan hasilnya. Periksa juga kesalahan panggilan OpenGL Anda dengan glGetError() untuk memastikan semuanya berfungsi dengan benar.

Membalas hasil edit Anda, menurut saya baris ini adalah masalah Anda:

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

const berarti konstanta waktu kompilasi, karena nilainya tidak dapat diubah secara seragam. F tidak bisa berupa konstanta karena variabel seragam bukanlah konstanta (waktu kompilasi). Pindahkan baris yang mendeklarasikan F ke badan main dan hapus kualifikasi const. Maka shader Anda akan berfungsi.

person Antti    schedule 28.01.2012
comment
Saya mencoba apa yang Anda katakan, saya memeriksa dengan glGetError() dan itu memberi saya kesalahan ketika saya mencoba mengikat shader (glUserProgram). Saya melakukan debug sedikit lebih jauh dan menyadari saya mendapat kesalahan kompilasi glsl. Saya telah mengedit posting pertama saya dengan lebih detail. Mungkin Anda tahu jawabannya? - person w00; 28.01.2012

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

Ketika GLSL mengatakan "konstan", yang dimaksud adalah konstanta waktu kompilasi. Nilai Eta tentu saja seragam dalam panggilan undian tertentu. Namun hal ini tidak konstan, karena dapat berubah di antara panggilan seri. Kompiler tidak mengetahui berapa nilai ini pada waktu kompilasi.

Variabel const adalah konstanta waktu kompilasi. Oleh karena itu harus diinisialisasi dengan ekspresi yang hanya terdiri dari konstanta waktu kompilasi. uniforms bukan konstanta waktu kompilasi, jadi Anda tidak dapat menginisialisasi variabel const dengan konstanta tersebut.

person Nicol Bolas    schedule 28.01.2012