OpenGL ES2颜色和纹理着色器

时间:2016-06-01 15:35:18

标签: android glsl opengl-es-2.0 vertex-shader

我想编写一个顶点着色器来处理我使用此代码的颜色和纹理

precision mediump float;
varying vec4 v_Color;
uniform sampler2D u_TextureUnit;
varying vec2 v_TextureCoordinates;

void main() {
    gl_FragColor= (v_Color*texture2D(u_TextureUnit, v_TextureCoordinates));
}

当模型具有纹理贴图时它起作用但如果模型只有颜色加载黑色,我想在放置u_TextureUnit之前检查sampler2D gl_FragColor

1 个答案:

答案 0 :(得分:4)

你写过一个从纹理单元读取的着色器;您通常应该避免着色器中的条件性,因为它可能会分割执行路径。通常情况下,如果您有条件地执行的操作是制服,编译器可以弄清楚它,但是每次设置制服时您最终都可能需要重新编译。 ES 2无法反省采样单元的当前属性,因此初步解决方案可能类似于:

uniform bool u_ApplyTexture;
...
if(u_ApplyTexture)
    gl_FragColor = {what you already have};
else
    gl_FragColor = v_Color;

可能作为替代方案分析的非条件替代方案可能是:

uniform float u_TextureWeight;
...
gl_FragColor = v_Color*
                   mix(vec4(1.0), 
                       texture2D(u_TextureUnit, v_TextureCoordinates), 
                       u_TextureWeight);

v_Color*vec4(1.0)u_TextureWeight0.0 v_Color*texture2D(u_TextureUnit, v_TextureCoordinates) u_TextureWeight1.0时评估为gl_FragColor = v_Color*(vec4(1.0) - texture2D(u_TextureUnit, v_TextureCoordinates));

如果你真的想要做鬼脸,你可能只是将纹理上传为负片图像并在着色器中再次将它们消极:

vec4(0.0)

很明显,如果您从采样单元获得v_Color因为未附加纹理,则最终会将1.0乘以if($_SERVER["REQUEST_METHOD"] == "GET") { // id enviado desde GET $id = mysqli_real_escape_string($db,$_GET['id']); // $db es la conexión MySQL if($id > 0 and $id < 400) { $sql = "SELECT url FROM urls WHERE id = '$id'"; // Traemos la primera URL del id correspondiente $result = mysqli_query($db,$sql); echo "Cantidad de rows devueltas x la consulta SQL:" ; echo mysqli_num_rows($result); echo "<br>"; while ($row = mysqli_fetch_array($result)) { echo $row[0]; echo "<br>"; } } }