使用着色器在OpenGL中进行照明

时间:2016-09-05 10:10:42

标签: opengl

我正在尝试将一些照明应用于纹理。 我创建了一个纹理立方体,并在其中放置了一个相机。 现在,我想点亮它的内部面孔。我被告知我应该使用着色器,所以我阅读了许多教程,我已经创建了:

顶点着色器:

sort

片段着色器

const GLchar* vertexSkySource =
#if defined(__APPLE_CC__)
"#version 150 core\n"
#else
"#version 130\n"
#endif
"uniform mat3 view_rot;"
"in vec3 position;"
"out vec3 Coord;"
"void main() {"
"   Coord = view_rot * position;"
"   gl_Position = vec4(position, 1.0);"
"}";

我初始化后

const GLchar* fragmentSkySource =
#if defined(__APPLE_CC__)
"#version 150 core\n"
#else
"#version 130\n"
#endif
"in vec3 Coord;"
"out vec4 outColor;"
"uniform samplerCube textureSampler;"
"void main() {"
"   outColor =  texture(textureSampler, Coord);"
"}";

然后在我的draw方法中,我将在void initialize_shader() { // shader per la skybox GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexSkySource, NULL); glCompileShader(vertexShader); { GLchar log[512]; GLsizei slen = 0; glGetShaderInfoLog(vertexShader, 512, &slen, log); if (slen) std::cerr << log << std::endl; } GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentSkySource, NULL); glCompileShader(fragmentShader); { GLchar log[512]; GLsizei slen = 0; glGetShaderInfoLog(fragmentShader, 512, &slen, log); if (slen) std::cerr << log << std::endl; } skyProgram = glCreateProgram(); glAttachShader(skyProgram, vertexShader); glAttachShader(skyProgram, fragmentShader); glBindFragDataLocation(skyProgram, 0, "outColor"); glLinkProgram(skyProgram); GLint status = 0; glGetProgramiv(skyProgram, GL_LINK_STATUS, &status); if (!status) { std::cout << "failed to link" << std::endl; GLchar log[256]; GLsizei slen = 0; glGetProgramInfoLog(skyProgram, 256, &slen, log); std::cout << log << std::endl; } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); } 方法中调用它:

main

我看不到立方体面上的灯光,我应该添加到着色器中?

1 个答案:

答案 0 :(得分:2)

您将光照参数(light_directionlight_intensityview_positionshininess)发送到着色器,但您没有收到它们或正在做任何事情他们。您的片段着色器仅读取纹理,但不会对其应用任何光照:

outColor =  texture(textureSampler, Coord);

阴影的完整来源很大,没有看到更多代码很难给出,所以我会给出一些指示:

  • 第一件事就是在C ++代码的各个部分添加一些glGetError()调用,以便您知道是否使用了错误的OpenGL API。
  • 除了位置,您还需要将顶点法线发送到着色器
  • 您需要选择着色算法,Blinn-Phong简单且广泛使用。
  • 您需要确保法线和光线方向位于同一坐标空间

因此,最后您的outColor需要与计算的着色相乘:

outColor =  texture(textureSampler, Coord) * shading;

但是你需要修改你的顶点和片段着色器,根据光的方向和顶点法线来计算它。

根据GitHub project编辑

我编译并运行了项目并且必须解决一些问题:

  • 为您的计算机设置了包含和库路径,而不是相对于项目目录。

  • 在片段着色器中,您正在声明&#34;阴影&#34; as&#34; out&#34;。删除该行,然后在vec4 shading = vec4(0.0, 0.0, 0.0, 1.0);

  • 之前添加shading += vec4...
  • vec4(light_intensity)错误且无法在我的NVIDIA Windows驱动程序上编译,请替换为vec4(light_intensity,1.0)

即使我修改了着色器以便始终输出红色,我也无法在屏幕上显示任何内容。