Friday 15 July 2011

c++ - My shaders stopped working -



c++ - My shaders stopped working -

i seem have broken shaders in program, here code:

vertex shader

#version 330 core uniform mat4 camera; uniform mat4 model; layout(location = 0) in vec3 vert; layout(location = 1) in vec3 vertnormal; out vec3 fragvert; out vec3 fragnormal; void main() { // pass variables fragment shader fragnormal = vertnormal; fragvert = vert; // apply matrix transformations vert gl_position = photographic camera * model * vec4(vert, 1); }

fragment shader

#version 150 core uniform mat4 model; uniform vec3 cameraposition; // material settings uniform float materialshininess; uniform vec3 materialspecularcolor; uniform vec3 materialcolor; uniform struct lite { vec3 position; vec3 intensities; //a.k.a color of lite float attenuation; float ambientcoefficient; } light; in vec3 fragnormal; in vec3 fragvert; out vec4 finalcolor; void main() { vec3 normal = normalize(transpose(inverse(mat3(model))) * fragnormal); vec3 surfacepos = vec3(model * vec4(fragvert, 1)); vec4 surfacecolor = vec4(materialcolor, 1); vec3 surfacetolight = normalize(light.position - surfacepos); vec3 surfacetocamera = normalize(cameraposition - surfacepos); //ambient vec3 ambient = light.ambientcoefficient * surfacecolor.rgb * light.intensities; //diffuse float diffusecoefficient = max(0.0, dot(normal, surfacetolight)); vec3 diffuse = diffusecoefficient * surfacecolor.rgb * light.intensities; //specular float specularcoefficient = 0.0; if(diffusecoefficient > 0.0) specularcoefficient = pow(max(0.0, dot(surfacetocamera, reflect(-surfacetolight, normal))), materialshininess); vec3 specular = specularcoefficient * materialspecularcolor * light.intensities; //attenuation float distancetolight = length(light.position - surfacepos); float attenuation = 1.0 / (1.0 + light.attenuation * pow(distancetolight, 2)); //linear color (color before gamma correction) vec3 linearcolor = ambient + attenuation*(diffuse + specular); //final color (after gamma correction) vec3 gamma = vec3(1.0/2.2); finalcolor = vec4(pow(linearcolor, gamma), surfacecolor.a); }

i have asset loading obj file, drawing such:

void openglview::run() { initializeandsetupwindow(window_width, window_height, "phongbunny"); glclearcolor(1.0f, 1.0f, 0.0f, 1.0f); loadbunnyasset(); assetinstance bunny1; bunny1.asset = bunny; bunny1.position = glm::vec3(2.0f, 2.0f, 2.0f); bunny1.scale = glm::vec3(1.0f, 1.0f, 1.0f); do{ glclear(gl_color_buffer_bit | gl_depth_buffer_bit); loaduniforms(bunny1); glenablevertexattribarray(0); glbindbuffer(gl_array_buffer, bunny.vertexbuffer); glvertexattribpointer(0, 3, gl_float, gl_false, 0, nullptr); glenablevertexattribarray(1); glbindbuffer(gl_array_buffer, bunny.normalbuffer); glvertexattribpointer(1, 3, gl_float, gl_false, 0, nullptr); glbindbuffer(gl_element_array_buffer, bunny.elementbuffer); gldrawelements(gl_triangles, bunny.elementssize, gl_unsigned_int, (void*)0); gldisablevertexattribarray(0); gldisablevertexattribarray(1); glfwswapbuffers(window); glfwpollevents(); } while (!glfwwindowshouldclose(window)); glfwdestroywindow(window); glfwterminate(); }

with beingness function load uniforms:

void openglview::loaduniforms(assetinstance assetinstance) { asset* asset = &assetinstance.asset; gluseprogram(asset->shaderprogramid); glm::mat4 projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 1000.0f); glm::mat4 photographic camera = projection * getviewmatrix(); glm::mat4 model = translate(assetinstance.position) * scale(assetinstance.position); gluint cameraid = glgetuniformlocation(asset->shaderprogramid, "camera"); gluint modelid = glgetuniformlocation(asset->shaderprogramid, "model"); gluint camerapositionid = glgetuniformlocation(asset->shaderprogramid, "cameraposition"); gluint lightpositionid = glgetuniformlocation(asset->shaderprogramid, "light.position"); gluint lightintensitiesid = glgetuniformlocation(asset->shaderprogramid, "light.intensities"); gluint lightattenuationid = glgetuniformlocation(asset->shaderprogramid, "light.attenuation"); gluint lightambientcoefficientid = glgetuniformlocation(asset->shaderprogramid, "light.ambientcoefficient"); gluint materialcolorid = glgetuniformlocation(asset->shaderprogramid, "materialcolor"); gluint materialshininessid = glgetuniformlocation(asset->shaderprogramid, "materialshininess"); gluint materialspecularcolorid = glgetuniformlocation(asset->shaderprogramid, "materialspecularcolor"); gluniformmatrix4fv(cameraid, 1, gl_false, &camera[0][0]); gluniformmatrix4fv(modelid, 1, gl_false, &model[0][0]); gluniform3fv(camerapositionid, 1, &cameraposition[0]); gluniform3fv(lightpositionid, 1, &light.position[0]); gluniform3fv(lightintensitiesid, 1, &light.intensities[0]); gluniform1f(lightattenuationid, light.attenuation); gluniform1f(lightambientcoefficientid, light.ambientcoefficient); gluniform3fv(materialcolorid, 1, &assetinstance.materialcolor[0]); gluniform1f(materialshininessid, assetinstance.materialshininess); gluniform3fv(materialspecularcolorid, 1, &assetinstance.materialspecularcolor[0]); }

and setup beingness done here:

openglview::openglview() { light.position = glm::vec3(0.0f, 7.0f, 3.0f); light.intensities = glm::vec3(0.3f, 0.3, 0.3f); light.attenuation = 0.3f; light.ambientcoefficient = 0.005f; cameraposition = glm::vec3(5.0f, 3.0f, 8.0f); }

for while had bunny1's position set 0, 0, 0 caused not drawn @ all, can't figure out why is? when changed 1, 1, 1 started draw, key_callback function (which rotates , scales bunny) stopped working. also, here translate , scale functions:

glm::mat4 openglview::translate(glm::vec3 position) { homecoming glm::translate(glm::mat4(), position); } glm::mat4 openglview::scale(glm::vec3 size) { homecoming glm::scale(glm::mat4(), size); }

and can't figure out why changing bunny1.position seems scale bunny instead of translating position?

the reason why bunny's scale changes when changing bunny1.position because scale bunny bunny1.position:

glm::mat4 model = translate(assetinstance.position) * scale(assetinstance.position);

that might reason why bunny disapears when setting it's position (0,0,0) since scale 0.

c++ opengl glsl shader

No comments:

Post a Comment