'texture2D':在Forward Compatibile上下文中删除了该功能

del*_*onX 3 c++ opengl glsl

我正在尝试使用GLSL这里实现5x5卷积滤镜(Find Edges)是我的.glsl源代码:

#version 150
#define SIZE 25

// A texture is expected
uniform sampler2D Texture;

// The vertex shader fill feed this input
in vec2 FragTexCoord;

// The final color
out vec4 FragmentColor;

float matr[25];
float matg[25];
float matb[25];

vec4 get_pixel(in vec2 coords, in float x, in float y) {
   return texture2D(Texture, coords + vec2(x, y));
}

float convolve(in float[SIZE] kernel, in float[SIZE] matrix) {
   float res = 0.0;
   for (int i = 0; i < 25; i++)
      res += kernel[i] * matrix[i];
   return clamp(res, 0.0, 1.0);
}

void fill_matrix() {
   float dxtex = 1.0 / float(textureSize(Texture, 0));
   float dytex = 1.0 / float(textureSize(Texture, 0));
   float[25] mat;
   for (int i = 0; i < 5; i++)
      for(int j = 0; j < 5; j++) {
        vec4 pixel = get_pixel(FragTexCoord,float(i - 2) * dxtex, float(j - 2) * dytex);
         matr[i * 5 + j] = pixel[0];
         matg[i * 5 + j] = pixel[1];
         matb[i * 5 + j] = pixel[2];
      }
}

void main() {

  float[SIZE] ker_edge_detection = float[SIZE] (
    .0,.0, -1., .0, .0,
    .0, .0,-1., .0, .0,
    .0, .0, 4., .0, .0,
    .0, .0, -1., .0,.0,
    .0, .0, -1., .0, .0
  );

  fill_matrix();

  FragmentColor = vec4(convolve(ker_edge_detection,matr), convolve(ker_edge_detection,matg), convolve(ker_edge_detection,matb), 1.0);
}
Run Code Online (Sandbox Code Playgroud)

当我运行我的代码时,它给了我错误:

Error Compiling Fragment Shader ...
ERROR: 0:17: 'texture2D' : function is removed in Forward Compatibile context
ERROR: 0:17: 'texture2D' : no matching overloaded function found (using implicit conversion)


Error Linking Shader Program ...
Attached fragment shader is not compiled.

Function is removed in Forward Compatibile context
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当我试图在其他Linux和Windows机器上运行代码时,它运行良好.此外,当我改变texture2Dget_pixel()函数返回texture只有它的工作就像一个魅力.有人可以解释哪里有问题?

Nic*_*las 7

错误说明了您需要知道的一切.texture2D是GLSL 1.00天的旧功能.它被删除并替换为texture,它使用函数重载来处理大多数采样器类型,而不是局限于sampler2D.因此,在核心配置文件或前向兼容性上下文中,您无法调用texture2D.