【发布时间】:2015-12-04 07:23:39
【问题描述】:
所以我的目标很简单。我正在尝试设置我的坐标空间,使原点位于屏幕的左下角,右上角的坐标为 (screen.width, screen.height)。
这也是一个完全 2d 的引擎,所以不需要 3d 的东西。我只需要这些坐标即可。
现在我正在尝试在屏幕上绘制几个点。主要是在 (0, 0), (width, height), (width / 2, height /2) 等地方,所以我可以看看事情是否正常。
不幸的是,现在我为实现这一目标所做的努力是徒劳的,我没有在设备的死点设置多个点(显然它们都是重叠的)。
所以这是我的代码我到底做错了什么?
顶点着色器
uniform vec4 color;
uniform float pointSize;
uniform mat4 orthoMatrix;
attribute vec3 position;
varying vec4 outColor;
varying vec3 center;
void main() {
center = position;
outColor = color;
gl_PointSize = pointSize;
gl_Position = vec4(position, 1) * orthoMatrix;
}
这就是我制作矩阵的方法。我正在使用 GLKit,所以理论上它是为我制作正交矩阵。但是,如果您有一个自定义功能,您认为最好这样做,那很好!我也可以用。
var width:Int32 = 0
var height:Int32 = 0
var matrix:[GLfloat] = []
func onload()
{
width = Int32(self.view.bounds.size.width)
height = Int32(self.view.bounds.size.height)
glViewport(0, 0, GLsizei(height), GLsizei(width))
matrix = glkitmatrixtoarray( GLKMatrix4MakeOrtho(0, GLfloat(width), 0, GLfloat(height), -1, 1))
}
func glkitmatrixtoarray(mat: GLKMatrix4) -> [GLfloat]
{
var buildme:[GLfloat] = []
buildme.append(mat.m.0)
buildme.append(mat.m.1)
buildme.append(mat.m.3)
buildme.append(mat.m.4)
buildme.append(mat.m.5)
buildme.append(mat.m.6)
buildme.append(mat.m.7)
buildme.append(mat.m.8)
buildme.append(mat.m.9)
buildme.append(mat.m.10)
buildme.append(mat.m.11)
buildme.append(mat.m.12)
buildme.append(mat.m.13)
buildme.append(mat.m.15)
return buildme
}
将其传递给着色器
func draw()
{
//Setting up shader for use
let loc3 = glGetUniformLocation(program, "orthoMatrix")
if (loc3 != -1)
{
//glUniformMatrix4fv(loc3, 1, GLboolean(GL_TRUE), &matrix[0])
glUniformMatrix4fv(loc3, 1, GLboolean(GL_TRUE), &matrix[0])
}
//Passing points and extra data
}
注意:如果您在顶点着色器中删除与矩阵的乘法,点会显示出来,但是由于默认 OpenGL 的工作方式,它们中的大多数显然不在屏幕上。
另外:我尝试过使用this 函数而不是 glKit 的方法。结果相同。也许我没有将可能的东西传递给矩阵制作函数,或者我没有正确地将它传递给着色器。
编辑:我已经抛出了project file,以防你想看看一切进展如何。
【问题讨论】:
-
GL_TRUE在 ES 2.0 中作为glUniformMatrix4fv()的第三个参数无效。 -
@Retro Koradi GL_FALSE 也不起作用
-
由于您不能将矩阵转置为上传的一部分,因此您可能必须在着色器代码中从左侧进行乘法运算。我对 GLKit 不熟悉,但大多数工具包构建的矩阵在乘以
matrix * vector时可以工作。 -
不幸的是,在顶点着色器中切换它什么也没做
-
我的意思是所有点都在中心。也许我应该以不同的方式构建矩阵?
标签: swift opengl-es opengl-es-2.0 glkit