无法使OpenGL代码正常工作

时间:2015-05-06 11:10:30

标签: opengl-es glsl webgl fragment-shader vertex-shader

我对OpenGL,GLSL和WebGL都很陌生。我试图让这个示例代码在http://shdr.bkcore.com/之类的工具中运行,但我无法让它工作。

顶点着色器:

void main()
{ 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    gl_TexCoord[0] = gl_MultiTexCoord0;
}

Fragment Shader:

precision highp float;
uniform float time;
uniform vec2 resolution;
varying vec3 fPosition;
varying vec3 fNormal;

uniform sampler2D tex0;

void main()
{
  float border = 0.01;
  float circle_radius = 0.5;
  vec4 circle_color = vec4(1.0, 1.0, 1.0, 1.0);
  vec2 circle_center = vec2(0.5, 0.5);

  vec2 uv = gl_TexCoord[0].xy;
  vec4 bkg_color = texture2D(tex0,uv * vec2(1.0, -1.0));

  // Offset uv with the center of the circle.
  uv -= circle_center;
  float dist = sqrt(dot(uv, uv));

  if ( (dist > (circle_radius+border)) || (dist < (circle_radius-border)) )
gl_FragColor = bkg_color;
else
gl_FragColor = circle_color;
}

我认为此代码必须来自该语言的过时版本,因此我将顶点着色器更改为:

precision highp float;
attribute vec2 position;
attribute vec3 normal;

varying vec2 TextCoord;
attribute vec2 textCoord;

uniform mat3 normalMatrix;
uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;
varying vec3 fNormal;
varying vec3 fPosition;

void main()
{

  gl_Position = vec4(position, 0.0, 1.0);
  TextCoord = vec2(textCoord);
}

这似乎修复了有关未声明标识符的错误消息,而无法从&#39; float&#39;转换。 to highp 4-component something-or-other&#34 ;,但我不知道从功能上来说,这是否会与原始目标做同样的事情。

另外,当我转换为Vertex Shader的这个版本时,我不知道我应该在片段着色器中使用这一行:

vec2 uv = gl_TexCoord[0].xy;

如何将此线转换为适合转换后的顶点着色器,如何确保顶点着色器均匀转换?

1 个答案:

答案 0 :(得分:0)

gl_TexCoord来自桌面OpenGL,而不是OpenGL ES的一部分。您需要创建一个新的用户定义的vec2,以保存坐标值。