所以我正在尝试编写一个折射着色器,在平面上有一个玻璃球。我的问题是纹理是纹理没有在平面上显示。
平面代码:
GLfloat plane[4][5] = // s, t, x, y, z
{
0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f, 100.0f,
1.0f, 1.0f, 80.0f, 0.0f, 100.0f,
1.0f, 0.0f, 80.0f, 0.0f, 0.0f,
};
void DrawPlane()
{
glBegin(GL_QUADS);
glVertex3fv(plane[0]+2);
glVertex3fv(plane[1]+2);
glVertex3fv(plane[2]+2);
glVertex3fv(plane[3]+2);
glEnd();
}
我的片段着色器看起来像这样:
varying vec3 varPosition;
varying vec2 varTexCoords;
uniform vec3 sphere_center;
uniform float sphere_radius;
uniform float sphere_refractive_index;
uniform vec3 eyePosition;
uniform sampler2D texture;
out vec3 fragColor;
void main()
{
vec3 ray_direction = normalize(varPosition - eyePosition);
float a = dot(ray_direction, ray_direction);
float b = 2.0 * dot(ray_direction, eyePosition - sphere_center);
float c = dot(sphere_center, sphere_center) + dot(eyePosition, eyePosition) - 2.0 * dot(sphere_center, eyePosition) - sphere_radius*sphere_radius;
float test = b*b - 4.0*a*c;
if (test >= 0.0) {
//there is an intersection with the sphere
//here I refract the ray
} else {
//no intersection with the sphere
//we test for shadow
if (test >= 0.0) {
//the point is in shadow
vec3 black = vec3(0.0);
fragColor = mix(texture2D(texture, varTexCoords).rgb,black,shadowIntensity).rgb;
} else {
//the point is not in shadow
fragColor = texture2D(texture, varTexCoords).rgb;
}
}
}
情况是球体被涂漆,但飞机仍然是灰色的。问题可能在于我的texCoords,因为如果我更改texture2D函数中的varTexCoords参数(类似于position.xz),它会绘制平面(当然不正确)。但在我看来,我在那里拥有一切必要的东西。
属性数组:
glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, 0, 5 * sizeof(GLfloat), (GLvoid*)(plane[0]+2));
glVertexAttribPointer(ATTRIB_TEX_COORDS, 2, GL_FLOAT, 0, 5 * sizeof(GLfloat), (GLvoid*)(plane[0]));
我绑定属性位置,然后启用顶点属性数组:
glBindAttribLocation(program->id(), ATTRIB_VERTEX, "position");
glBindAttribLocation(program->id(), ATTRIB_TEX_COORDS, "texCoords");
glEnableVertexAttribArray(ATTRIB_VERTEX);
glEnableVertexAttribArray(ATTRIB_TEX_COORDS);
我尝试了一切。也许错误是微不足道的,我不能再思考了,因为我这个接近失去理智。
任何提示都表示赞赏。
答案 0 :(得分:0)
使用纹理坐标不。你确实设置了一些属性指针,但这些从未使用过,因为你使用立即模式glBegin()
/ glEnd()
绘制平面,而没有指定任何tex-coords(所以着色器会看到一个该属性的常量值)。只有在实际发出基于顶点数组的绘图调用时才会使用您设置的属性指针,例如glDrawArrays()
或glDrawElements()
。