我正在尝试将一些照明应用于纹理。 我创建了一个纹理立方体,并在其中放置了一个相机。 现在,我想点亮它的内部面孔。我被告知我应该使用着色器,所以我阅读了许多教程,我已经创建了:
顶点着色器:
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
我看不到立方体面上的灯光,我应该添加到着色器中?
答案 0 :(得分:2)
您将光照参数(light_direction
,light_intensity
,view_position
和shininess
)发送到着色器,但您没有收到它们或正在做任何事情他们。您的片段着色器仅读取纹理,但不会对其应用任何光照:
outColor = texture(textureSampler, Coord);
阴影的完整来源很大,没有看到更多代码很难给出,所以我会给出一些指示:
glGetError()
调用,以便您知道是否使用了错误的OpenGL API。因此,最后您的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)
即使我修改了着色器以便始终输出红色,我也无法在屏幕上显示任何内容。