- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想渲染地形并根据高度应用颜色。
我正在编写一个 Qt 项目,所以使用 QGlShaderProgram。
我的地形网格从 (0,0,0) 到 (1000,0,1000),顶点每隔 100 个长度单位放置一次。我想使用统一数组将数据传输到着色器。
我在向着色器发送数据时仍然遇到问题。
从 C++/Qt 调用:
QGLShaderProgram mShader;
QVector< GLfloat> mHeightMap (10*10, some_data);
GLfloat mXStepSize = 100;
GLfloat mZStepSize = 100;
// ..
mShader.link();
mShader.bind();
mShader.setUniformValueArray( "heights",
&(mHeightMap[0]), // one line after another
mHeightMap.size(), 1 );
mShader.setUniformValue( "x_res", (GLint) mXStepSize);
mShader.setUniformValue( "z_res", (GLint) mZStepSize);
着色器源代码:
uniform sampler2D heights;
uniform int x_res;
uniform int z_res;
void main(void)
{
vec4 tmp = gl_Vertex;
vec4 h;
float x_coord = gl_Vertex[0] * 0.001;
float z_coord = gl_Vertex[2] * 0.001;
// interprete as 2D:
int element = int( (x_coord + float(x_res)*z_coord) );
h = texture2D( heights, vec2(x_coord, z_coord));
gl_FrontColor = gl_Color;
gl_FrontColor[1] = h[ element]; // set color by height
tmp.y = h[ element]; // write height to grid
gl_Position = gl_ModelViewProjectionMatrix * tmp;
}
我哪里错了?
我应该如何将数据加载到着色器,然后在那里访问它?
最佳答案
您想将其作为纹理传递,您必须首先使用 glTexImage2D 将数组贴图 (mHeightMap) 转换为 opengl 纹理。看看这个,它可能是你要找的:https://gamedev.stackexchange.com/questions/45188/how-can-i-pass-an-array-of-floats-to-the-fragment-shader-using-textures
编辑:你可能想调整其中的一些,但这是想法:
//Create texture:
glint texture;
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, &(mHeightMap.constData()[data_start]));
//pass it to shader
glint uniformId = glGetUniformid(shader, "height");
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(uniformId, 0); // 0 is the texture number
关于c++ - 带有顶点着色器和 QGLShaderProgram 的 OpenGL HeightMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19638392/
我用 DynamicLOD 创建了一个二十面体。这很管用。现在我想使用高度图来添加地形。首先,我尝试使用 GrayScale HeightMap。但结果只是随机位移。比我尝试使用下面的黑白图像并得到这
我想在建模为高度图的世界地面上的 OpenGL 场景中跟踪鼠标坐标。目前没有像硬件镶嵌这样的花哨的东西。注意这个问题是不是 关于物体拾取。 目前我正在执行以下操作,由于回读操作,这显然会降低性能: 渲
我想渲染地形并根据高度应用颜色。 我正在编写一个 Qt 项目,所以使用 QGlShaderProgram。 我的地形网格从 (0,0,0) 到 (1000,0,1000),顶点每隔 100 个长度单位
我是一名优秀的程序员,十分优秀!