opengl-es - 无法让 OpenGL 代码正常工作

标签 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;
}

片段着色器:
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);
}

这似乎修复了有关未声明标识符的错误消息,并且无法“从'float'转换为highp 4-component something-or-other”,但我不知道从功能上讲,这是否会与原意。

另外,当我转换到这个版本的顶点着色器时,我不知道我应该在片段着色器中用这条线做什么:
vec2 uv = gl_TexCoord[0].xy;

如何转换这条线以适应转换后的顶点着色器,以及如何确保顶点着色器甚至正确转换?

最佳答案

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

关于opengl-es - 无法让 OpenGL 代码正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30075031/

相关文章:

iphone - 在opengl ES中画一个箭头

c++ - 如何进行GL_LINE_LOOP抗锯齿?

c++ - 在 GLSL(330 或其他)中,什么会导致统一结构的行为不同于可变结构?

unity-game-engine - 如何编写基于网络的音乐可视化工具?

javascript - Three.js 场景剧烈抖动

glsl - WebGL 使用什么版本的 GLSL

fonts - OpenGL-ES 字体渲染(在 iOS 上)...完整性检查

java - 使用 Libgdx 的动画背景

c - 由于 if 语句的 glCompileShader 段错误

opengl - 通用 GLSL 光照着色器