1
OpenGl ES 2.0を使用し、IOS Swift 3に変換したいAndroidコードがあります。 私は一日中グーグルで過ごしましたが、うまく動作しません。 私を助けることができます...OpenGL ES 2.0 AndroidからIOS Swift 3へ
私のシェイダーは正常に動作するはずです、私はちょうどglVertexAttribPointer関数で描かれる頂点配列を渡すことができますが、IOSではそれは同じように動作しないと私は理解できませんどのように頂点配列を作成/ロードに出て...
スウィフト(動作しない)
これは私のヘルパークラスである:
import Foundation
import OpenGLES
import GLKit
class VertexArray : NSObject {
private var floatBuffer = [GLfloat]()
init(_ vertexData : Array<Float>) {
for i in 0 ..< vertexData.count {
floatBuffer.append(GLfloat(vertexData[i]))
}
public func prepareToDraw() {
// Create a Vector Buffer Object that will store the vertices on video memory
var vbo : GLuint = GLuint()
glGenBuffers(1, &vbo)
// Allocate space and upload the data from CPU to GPU
glBindBuffer(GLenum(GL_ARRAY_BUFFER), vbo)
glBufferData(GLenum(GL_ARRAY_BUFFER), MemoryLayout.size(ofValue: floatBuffer), floatBuffer, GLenum(GL_STATIC_DRAW))
}
public func setVertexAttribPointer(_ dataOffset : Int, _ attributeLocation : GLuint, _ componentCount : Int, _ stride : Int) {
glEnableVertexAttribArray(attributeLocation)
glVertexAttribPointer(attributeLocation, GLint(componentCount), GLenum(GL_FLOAT), GLboolean(UInt8(GL_FALSE)), GLsizei(stride), BUFFER_OFFSET(dataOffset))
}
func BUFFER_OFFSET(_ i: Int) -> UnsafeRawPointer? {
return UnsafeRawPointer(bitPattern: i)
}
}
は、今私は私のVertexArrayを作成し、それが長方形である:
let triangleVertices : [Float] = [
//Order of coordinates x, y, r, g, b, a
pos.x, pos.y+Float(height), r3, g3, b3, alpha,
pos.x+Float(width), pos.y+Float(height), r4, g4, b4, alpha,
pos.x, pos.y, r1, g1, b1, alpha,
pos.x+Float(width), pos.y, r2, g2, b2, alpha
]
vertexArray = VertexArray(triangleVertices)
そして、私はこのようにそれを描く:
internal static let POSITION_COMPONENT_COUNT = 2 //x,y
internal static let COLOR_COMPONENT_COUNT = 4 //r,g,b,a
internal static let STRIDE = (POSITION_COMPONENT_COUNT + COLOR_COMPONENT_COUNT) * 4
public override func draw(_ projectionMatrix : Array<GLfloat>) {
if (visible) {
glEnable(GLenum(GL_BLEND))
glBlendFunc(GLenum(GL_SRC_ALPHA), GLenum(GL_ONE_MINUS_SRC_ALPHA))
ProgramManager.useProgram(ProgramManager.colorShaderProgram)
ProgramManager.setColorShaderUniforms(projectionMatrix)
vertexArray.prepareToDraw()
vertexArray.setVertexAttribPointer(
0,
GLuint(colorProgram.getPositionAttributeLocation()),
GL_Colored_Shape.POSITION_COMPONENT_COUNT,
GL_Colored_Shape.STRIDE)
vertexArray.setVertexAttribPointer(
GL_Colored_Shape.POSITION_COMPONENT_COUNT,
GLuint(colorProgram.getColorAttributeLocation()),
GL_Colored_Shape.COLOR_COMPONENT_COUNT,
GL_Colored_Shape.STRIDE)
glDrawArrays(GLenum(GL_TRIANGLE_STRIP), 0, 4)
glDisable(GLenum(GL_BLEND))
}
}
アンドロイド(作業中)
import static android.opengl.GLES20.GL_FLOAT;
import static android.opengl.GLES20.glEnableVertexAttribArray;
import static android.opengl.GLES20.glVertexAttribPointer;
import static com.ldk.madquiz.Constants.BYTES_PER_FLOAT;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
public class VertexArray {
private final FloatBuffer floatBuffer;
public VertexArray(float[] vertexData) {
floatBuffer = ByteBuffer
.allocateDirect(vertexData.length * BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer()
.put(vertexData);
}
public void setVertexAttribPointer(int dataOffset, int attributeLocation,
int componentCount, int stride) {
floatBuffer.position(dataOffset);
glVertexAttribPointer(attributeLocation, componentCount, GL_FLOAT,
false, stride, floatBuffer);
glEnableVertexAttribArray(attributeLocation);
floatBuffer.position(0);
}
}
スウィフトで
protected static final int POSITION_COMPONENT_COUNT = 2; //x,y
protected static final int COLOR_COMPONENT_COUNT = 4; //r,g,b,a
protected static final int STRIDE = (POSITION_COMPONENT_COUNT
+ COLOR_COMPONENT_COUNT) * 4;
@Override
public void draw(float[] projectionMatrix) {
if (visible) {
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
ProgramManager.useProgram(ProgramManager.colorShaderProgram);
ProgramManager.setColorShaderUniforms(projectionMatrix);
vertexArray.setVertexAttribPointer(
0,
colorProgram.getPositionAttributeLocation(),
POSITION_COMPONENT_COUNT,
STRIDE);
vertexArray.setVertexAttribPointer(
POSITION_COMPONENT_COUNT,
colorProgram.getColorAttributeLocation(),
COLOR_COMPONENT_COUNT,
STRIDE);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisable(GL_BLEND);
}
}
を描くVertexArray
float[] triangleVertices = {
//Order of coordinates x, y, r, g, b, a
pos.x, pos.y+height, r3, g3, b3, alpha,
pos.x+width, pos.y+height, r4, g4, b4, alpha,
pos.x, pos.y, r1, g1, b1, alpha,
pos.x + width, pos.y, r2, g2, b2, alpha
};
vertexArray = new VertexArray(triangleVertices);
の作成:何も描かれていないと、それは私にエラーを与えるものではありません。
おかげ レオ
あなたの結果は何ですか?何か描かれていますか? Constants.BYTES_PER_FLOATとは何ですか? prepareToDrawでは毎回新しいバッファを作成しますが、これを削除することはありません。これはメモリリークです...全体的に、iOS上でObjective-Cを使用することをお勧めします(Swiftではまだ使用できます)。 –
何も描画されていませんが、エラーが発生しません。 BYTES_PER_FLOAT = 4 私は今、objective-cを試していますが、同じ問題があるようです。 Androidでは、glVertexAttribPointer関数の最後に配列を渡します。int Swift glVertexAttribPointerは配列を渡すことはできません。 – LDK
色を出力するためにバッファをクリアしますか?非常に簡単な図面を試しましたか?たとえば、シェーダがハードコーディングされた色を出力する静的三角形は1つだけですか? –