所以我正在用C ++开发一个项目(以便在将来学习和创建游戏),并且我已经选择了OpenGL 3.3。我一直在处理内置在我的处理器中的英特尔HD 4000,因为它打开了默认的新应用程序,一切都很顺利。但后来我试图在我的第二个GPU上打开它 - nVidia GTX660m,速度要快得多,而且我预计它会有更多的FPS。但不,不仅我有几十个漏洞(例如 - 如果我在片段着色器中输出vec3作为颜色,那么英特尔就可以了,但是如果我没有推出vec4,nVidia会全力以赴疯狂......)。当然在编译时没有任何错误,所以极难修复...
但是现在,当我修复了大部分内容时,我正在处理一个我无法解决的问题(可能会有一些肮脏的方式但是......这不是重点)。
简而言之:我在两个GPU上生成有效的深度贴图,但是在nVidia GPU上它不是灰度,黑色到黑色比例这是非常奇怪的,因为相同的代码在同一个机器(几乎)应该运行相同(也是相同的API!)。由于这个事实我的片段着色器可能没有赶上它,并且在nVidia上没有检测到亮区和它完全黑暗(至少在聚光灯下,定向光不起作用)。
照片管理:
重要 - 请注意GTX660m上的深度图是redToBlack比例,而非英特尔GPU上的灰度等级。前一个来自定向灯,下一个来自点光源。
My FragmentShader: #version 330核心
in vec2 UV; //Coords for standard texture (model)
in vec4 ShadowCoord; //Coords for directional light (pos)
in vec4 POVShadowCoord; //Coords for spot light (flashlight) (pos)
out vec4 color; //Output color
uniform sampler2D myTextureSampler; //Standard texture with data for models
uniform sampler2D shadowMap; //Shadowmap for directional light
uniform sampler2D POVshadowMap; //Shadowmap for spot light (flashlight)
void main(){
vec3 tex_data = texture2D( myTextureSampler, UV ).rgb;
float bias = 0.005;
float visibility = 0.7;
float decrease = 0.002;
int early_bailing = 0;
if ( texture2D( shadowMap, ShadowCoord.xy + vec2(0,0)/1850.0 ).z < ShadowCoord.z-bias ) {
visibility -= decrease; early_bailing++;
}
if ( texture2D( shadowMap, ShadowCoord.xy + vec2(-2,-2)/1850.0 ).z < ShadowCoord.z-bias ) {
visibility -= decrease; early_bailing++;
}
if ( texture2D( shadowMap, ShadowCoord.xy + vec2(-2, 2)/1850.0 ).z < ShadowCoord.z-bias ) {
visibility -= decrease; early_bailing++;
}
if ( texture2D( shadowMap, ShadowCoord.xy + vec2( 2,-2)/1850.0 ).z < ShadowCoord.z-bias ) {
visibility -= decrease; early_bailing++;
}
if ( texture2D( shadowMap, ShadowCoord.xy + vec2( 2, 2)/1850.0 ).z < ShadowCoord.z-bias ) {
visibility -= decrease; early_bailing++;
}
if(early_bailing < 5) {
if(early_bailing > 0) {
for (int i=-2; i < 2; i++) {
for(int j = -2; j < 2; j++) {
if(i == 0 && j == 0) continue;
if(i == -2 && j == -2) continue;
if ( texture2D( shadowMap, ShadowCoord.xy + vec2(i,j)/850.0 ).z < ShadowCoord.z-bias )
visibility -= decrease;
}
}
}
} else {
visibility -= 14 * decrease;
}
float x = POVShadowCoord.x/POVShadowCoord.w;
float y = POVShadowCoord.y/POVShadowCoord.w;
bias = 0.0004;
if(x < 0 || x > 1 || y < 0 || y > 1) {
visibility -= 0.6;
} else {
float min_visibility = visibility - 0.6;
if ( textureProj( POVshadowMap, POVShadowCoord.xyw).z < (POVShadowCoord.z - bias)/POVShadowCoord.w) {
visibility = min_visibility;
} else {
//Flashlight effect
float dx = 0.5 - x;
float dy = 0.5 - y;
visibility -= sqrt(dx*dx + dy*dy);
if(visibility < min_visibility)
visibility = min_visibility;
}
}
color = vec4(visibility * tex_data, 1);
}
第一部分用于定向光 - 我在5个点预采样深度图,如果全部相同我不采样更多(早期捞 - 多性能优化!),或者如果有些不同,我采样全部并计算阴影强度当前片段。
第二部分只是从点光源深度图中采样,然后我检查距离光线中心的距离以模拟手电筒效果(在中心更强)。
我认为不需要更多内容,但如果是,请写,我会发布所需的代码。
另外 - 阴影贴图只有16位精度(GL_DEPTH_COMPONENT16)英特尔HD4000比我的GTX660m(更强大)更快 - 这非常奇怪。虽然我认为它因为我不会绘制任何高多边形,只有很多非常低的多边形。我是对的吗?
答案 0 :(得分:1)
我在其他地方得到了答案。供将来参考 - 采样深度图使用红色通道(或.x值),如sample.r(/ sample.x),而不是.b(/。z),就像我一样。