OpenGL 0 (84): ошибка C7623: неявное сужение типа от "vec4" до "float" - PullRequest
1 голос
/ 28 октября 2019

Я работаю над тенями для шейдера Minecraft, и я застрял при попытке решить следующую ошибку.

21:51:27.725   
[Shaders] Error compiling fragment shader: /shaders/composite.fsh  
21:51:27.726  
[Shaders] Shader info log: /shaders/composite.fsh  
0(84) : error C7623: implicit narrowing of type from "vec4" to "float"  
21:51:27.727  
[Shaders] Error linking program: 10 (composite)  

Я знаю, что ошибка вызвана несовместимыми типами, но я все еще не уверенкак решить, так что любая помощь приветствуется.

#version 120


const int shadowMapResolution = 2048;
const float shadowDistance = 128;
const float shadowMapBias = 0.85;
const int noiseTextureResolution = 256;
#define SHADOWMAP_BIAS 0.85

uniform sampler2D colortex0;
uniform sampler2D shadowtex0;
uniform sampler2D shadowcolor0;
uniform sampler2D depthtex1;
uniform sampler2D noisetex;


uniform vec3 cameraPosition;
uniform mat4 gbufferModelViewInverse;
uniform mat4 gbufferModelView;
uniform mat4 shadowProjection;
uniform mat4 gbufferProjection;
uniform mat4 gbufferProjectionInverse;
uniform mat4 shadowModelView;

uniform float viewWidth;
uniform float viewHeight;

varying vec4 texcoord;

float depth = 0.5;

vec4 getCameraPosition(in vec2 coord)
{
    float getdepth = depth;
    vec4 positionNdcSpace = vec4(coord.s * 2.0 - 1.0, coord.t * 2.0 - 1.0, 2.0 * getdepth - 1.0, 1.0);
    vec4 positionCameraSpace = gbufferProjectionInverse * positionNdcSpace;

    return positionCameraSpace / positionCameraSpace.w;
}

vec4 getWorldSpacePosition(in vec2 coord)
{
    vec4 cameraPos = getCameraPosition(coord);
    vec4 worldPos = gbufferModelViewInverse * cameraPos;
    worldPos.xyz += cameraPosition;

    return worldPos;
}

vec3 getShadowSpacePosition(in vec2 coord)
{
    vec4 worldSpacePos = getWorldSpacePosition(coord);
    worldSpacePos.xyz -= cameraPosition;
    vec4 shadowSpacePos = shadowModelView * worldSpacePos;
    shadowSpacePos = shadowProjection * shadowSpacePos;

    return shadowSpacePos.xyz * 0.5 + 0.5;
}

mat2 getRotationMatrix(in vec2 coord)
{
    float rotationAmount = texture2D(
        noisetex,
        coord * vec2(
            viewWidth / noiseTextureResolution,
            viewHeight / noiseTextureResolution
        )
    ).r;
    return mat2(
        cos(rotationAmount), -sin(rotationAmount),
        sin(rotationAmount), cos(rotationAmount)
    );
}

vec3 getShadows(in vec2 coord)
{
    vec3 shadowCoord = getShadowSpacePosition(coord);
    mat2 rotationMatrix = getRotationMatrix(coord);
    vec3 shadowCol = vec3(0.0);
    for (int i = 0; i < 32; i++)
    {
        vec2 offset = vec2(32 / shadowMapResolution);
        offset = rotationMatrix * offset;
        float shadowMapSample = texture2D(shadowtex0, shadowCoord.st + offset);
        float visibility = step(shadowCoord.z - shadowMapSample, 0.001);
        vec3 dayCol = vec3(1.0);
        vec3 colorSample = texture2D(shadowcolor0, shadowCoord.st + offset).rgb;
        shadowCol += mix(colorSample, dayCol, visibility);
    }

    return vec3(shadowCol) / 32;
}

vec3 calculateLighting(in vec3 color)
{
    vec3 sunLight = getShadows(texcoord.st);
    vec3 ambientLight = vec3(0.5, 0.7, 1.0) * 0.5;

    return color * (sunLight + ambientLight);
}

void main()
{
    depth = texture2D(depthtex1, texcoord.st).r;
    vec3 color = texture2D(colortex0, texcoord.st).rbg;
    color = calculateLighting(color);

    gl_FragData[0] = vec4(color, 1.0);
    gl_FragData[1] = vec4(depth);
}

1 Ответ

2 голосов
/ 28 октября 2019

Проблема в том, что texture2D возвращает vec4, но вы рассматриваете как float. Вместо этого прочитайте красный компонент

float shadowMapSample = texture2D(shadowtex0, shadowCoord.st + offset).r;
...