所以我的目标很简单。我试图设置我的坐标空间,以便原点位于屏幕的左下角,右上角坐标是(screen.width,screen.height)。
这也是一个完全的2d引擎,所以不需要3D东西。我只需要那些坐标就可以了。
现在我试图在屏幕上绘制几个点。主要是在(0,0),(宽度,高度),(宽度/ 2,高度/ 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想要看看一切如何。{/ p>
答案 0 :(得分:1)
好的,我终于想通了!我做了什么 1.将glkit矩阵转换为数组时,我错误计算了 2.当将矩阵作为制服传递时,您实际上希望整个数组的地址不仅仅是起始元素。 3.将矩阵传递给着色器时,GL_FALSE不是正确的参数。
谢谢你reto matic