我为Mac OS X 10.5及更高版本编写了一个OpenGL屏幕保护程序,它显示了使用行进立方体构建的旋转心脏.它在我的黑色13.3"开发Macbook运行Snow Leopard(10.6)上运行良好,漂亮而有光泽.

但是当我在较新的Macbook Pro上试用它但运行豹子(10.5)时,心脏没有光泽.它看起来好像只用环境光/漫射光照亮,但没有镜面光.就好像我已经将灯光的镜面反射分量设置为0.较新的Macbook有一个Nvidia显卡.运行10.6的旧版本有一台Intel XMA3100.

这是我的OpenGL初始化代码.使用行进立方体创建心脏,我也计算法线向量.
- (void)setUpOpenGL
{
[[glView openGLContext] makeCurrentContext];
// Synchronize buffer swaps with vertical refresh rate
GLint swapInterval = 1;
[[glView openGLContext] setValues:&swapInterval
forParameter:NSOpenGLCPSwapInterval];
glShadeModel(GL_SMOOTH);
glClearDepth(1.0);
glClearColor (0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
// Light
GLfloat ambient_light[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat diffuse_light[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat specular_light[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat position_light[] = { 0.0f, 0.0f, -1.0f, 0.0f };
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, … 我正在写一个Phong阴影的小测试,我正在撞击一堵砖墙,试图让镜面反射元件正常工作.它似乎工作正常,除了镜面光应用于对象的前后.(对象本身是透明的,面部手动排序CPU侧.)
请注意,漫反射组件完美地工作(仅显示在面向光源的一侧) - 这似乎排除了到达片段着色器的法线的问题,我认为.
据我所知,镜面反射分量与眼睛矢量和反射光矢量之间的角度的cos成比例.
为了保持简单,我的测试代码试图在世界空间中做到这一点.照相机位置和光矢量被硬编码(对不起)作为(0,0,4)和(-0.707, 0, -0.707)分别.因此,眼睛矢量(0,0,4) - fragPosition.
由于模型矩阵仅执行旋转,因此顶点着色器仅通过模型矩阵转换顶点法线.(注意:这不是很好的做法,因为许多类型的转换都不能保持正常的正交性.通常对于普通矩阵,你应该使用模型矩阵的左上角3x3的逆转置.)为了简单起见,片段着色器在单个浮点颜色通道上运行,并跳过镜面反射指数(/使用指数1).
顶点着色器:
#version 140
uniform mat4 mvpMtx;
uniform mat4 modelMtx;
in vec3 inVPos;
in vec3 inVNormal;
out vec3 normal_world;
out vec3 fragpos_world;
void main(void) {
gl_Position = mvpMtx * vec4(inVPos, 1.0);
normal_world = vec3(modelMtx * vec4(inVNormal, 0.0));
fragpos_world = vec3(modelMtx * vec4(inVPos, 1.0));
}
Run Code Online (Sandbox Code Playgroud)
片段着色器:
#version 140
uniform float
uLightS,
uLightD,
uLightA;
uniform float uObjOpacity;
in vec3 normal_world, fragpos_world;
out …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我们的项目中实现基于物理的渲染(PBR)(我们开始用于学术和学习目的的小型游戏引擎)并且我无法理解根据材料的金属和粗糙度计算镜面反射和漫反射贡献的正确方法是什么.
我们不使用任何第三方库/引擎进行渲染,一切都是用OpenGL 3.3手写的.
现在我有这个(我将把完整的代码放在下面):
// Calculate contribution based on metallicity
vec3 diffuseColor = baseColor - baseColor * metallic;
vec3 specularColor = mix(vec3(0.00), baseColor, metallic);
Run Code Online (Sandbox Code Playgroud)
但我的印象是,镜面术语必须以某种方式依赖于粗糙度.我想把它改成这个:
vec3 specularColor = mix(vec3(0.00), baseColor, roughness);
Run Code Online (Sandbox Code Playgroud)
但同样,我不确定.做正确的方法是什么?是否有正确的方法,或者我应该使用'试错'方法,直到我得到满意的结果?
这是完整的GLSL代码:
// Calculates specular intensity according to the Cook - Torrance model
float CalcCookTorSpec(vec3 normal, vec3 lightDir, vec3 viewDir, float roughness, float F0)
{
// Calculate intermediary values
vec3 halfVector = normalize(lightDir + viewDir);
float NdotL = max(dot(normal, lightDir), 0.0);
float NdotH = max(dot(normal, halfVector), 0.0);
float NdotV …Run Code Online (Sandbox Code Playgroud) 我正在尝试在基于体素的网格上实现环境遮挡,并在面的边缘处获得这些闪烁的白色像素:

这是我的片段着色器:
#version 120
varying vec4 color;
varying vec4 normal;
void main(void)
{
float light = normal.w + max(0.15*dot(normal.xyz, vec3(1,1,1)), 0.0);
gl_FragColor = vec4(color.xyz * light, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
如果我light从中删除了gl_FragColor vec4那么神器就会消失.该light值根据环境遮挡值(normal.w)和镜面反射分量计算得出.似乎这是导致问题的镜面反射.为什么角落和边缘会突然闪现?当网格旋转时,白色像素看起来会闪烁.但是在较大的表面上,镜面高光看起来是正常的并且跟随光源而不是闪烁.
我如何实现加载纹理以用作几何体的高光贴图并使用C++在Directx9中渲染它?
我可以参考任何教程或基本示例吗?
我必须计算图像的镜面反射高光(phong).给出了法向量和"光矢量".现在我必须计算光反射 - 是否有一个有效的matlab函数来翻转法向量上的光矢量以获得反射光矢量?
我spec = k s*I*(r*v)p
其中:
l光矢量
n是表面的法向量,
r反射矢量
v是从反射点到观察者的矢量
p是光泽度