【发布时间】:2018-07-03 15:30:47
【问题描述】:
我成功地在 openGL 中使用纹理生成了高度图。该数据的全貌如下图所示。但是,当我在我的 glTexParameteri (MinMag) 中使用 GL_LINEAR 选项时,它给了我外部工件。
这是我的 glTexParameter
if (interpolate) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
else {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
这是我的片段着色器代码
"varying vec2 tex;\n"
"uniform int colorSizeI;\n"
"uniform vec4 colorTable[512];\n"
"uniform vec2 minmaxZ;\n"
"uniform vec3 backgroundColor;\n"
"uniform sampler2D diffuse;\n"
"uniform float transparency;\n"
"void main() {\n"
" float color = texture2D(diffuse, tex).r;\n"
" float h = (color - minmaxZ[0])/(minmaxZ[1] - minmaxZ[0]);\n"
" float colorSizeF = float(colorSizeI);\n"
" int i = 0;\n"
" float j = 0.0f;\n"
" vec3 base;\n"
" if (color == 0.0f) {\n"
" base = vec3(0.0f, 0.0f, 0.0f);}\n"
" else if (color <= minmaxZ[0]) {\n"
" base = colorTable[0].xyz;}\n"
" else if (color >= minmaxZ[1]) {\n"
" base = colorTable[colorSizeI - 1].xyz;}\n"
" else { \n"
" while (h >= (j + 1.0f)/colorSizeF) {\n"
" i += 1;\n"
" j += 1.0f;}\n"
" base = mix(colorTable[i].xyz, colorTable[i+1].xyz, colorSizeF*(h - (j/colorSizeF)));}\n"
" gl_FragColor = vec4(base, transparency);\n"
"}\n";
那么,有谁知道如何移除这些工件?
注意:当 color = 0 时,外部的黑色也是考虑数据。
【问题讨论】:
-
夹边
GL_CLAMP_TO_EDGE或GL_CLAMP -
我用了GL_CLAMP_TO_EDGE,忘了说,当z = 0时,正方形外面的黑色实际上也是数据;所以我不相信这是因为texturewrap。
-
你必须提供所有的
::glTexParameteri调用,这样我们才能看到你在做什么 -
如果你这样做会发生什么
gl_FragColor = texture2D(diffuse, tex) -
我使用纹理来避免使用顶点和索引(减少内存)。在纹理(红色)数据中包含将根据片段着色器中的计算以颜色显示的高度图。因此,如果我执行
gl_FragColor = texture2D(diffuse, tex),它将不会显示我想要显示的数据。
标签: c++ opengl texture-mapping