我对 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/