UIImageをGLSLシェーダーに渡そうとしています。フラグメントシェーダーは次のとおりです。
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2;
void main()
{
highp vec4 color = texture2D(inputImageTexture, textureCoordinate);
highp vec4 color2 = texture2D(inputImageTexture2, textureCoordinate);
gl_FragColor = color * color2;
}
私がやりたいのは、カメラから画像を送信し、テクスチャと乗算ブレンドすることです。カメラからデータを送信するだけで、すべて問題ありません。したがって、問題は別のテクスチャをシェーダーに送信することにあるはずです。私はそれをこのようにやっています:
- (void)setTexture:(UIImage*)image forUniform:(NSString*)uniform {
CGSize sizeOfImage = [image size];
CGFloat scaleOfImage = [image scale];
CGSize pixelSizeOfImage = CGSizeMake(scaleOfImage * sizeOfImage.width, scaleOfImage * sizeOfImage.height);
//create context
GLubyte * spriteData = (GLubyte *)malloc(pixelSizeOfImage.width * pixelSizeOfImage.height * 4 * sizeof(GLubyte));
CGContextRef spriteContext = CGBitmapContextCreate(spriteData, pixelSizeOfImage.width, pixelSizeOfImage.height, 8, pixelSizeOfImage.width * 4, CGImageGetColorSpace(image.CGImage), kCGImageAlphaPremultipliedLast);
//draw image into context
CGContextDrawImage(spriteContext, CGRectMake(0.0, 0.0, pixelSizeOfImage.width, pixelSizeOfImage.height), image.CGImage);
//get uniform of texture
GLuint uniformIndex = glGetUniformLocation(__programPointer, [uniform UTF8String]);
//generate texture
GLuint textureIndex;
glGenTextures(1, &textureIndex);
glBindTexture(GL_TEXTURE_2D, textureIndex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_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);
//create texture
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pixelSizeOfImage.width, pixelSizeOfImage.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textureIndex);
//"send" to shader
glUniform1i(uniformIndex, 1);
free(spriteData);
CGContextRelease(spriteContext);
}
テクスチャの均一性は問題ありません。glGetUniformLocation関数は-1を返しません。テクスチャは解像度2000x2000ピクセルのPNGファイルです。
問題:テクスチャがシェーダーに渡されると、「黒い画面」が表示されます。おそらく問題は、CGContextのパラメーターまたは関数glTexImage2Dのパラメーターです。
更新:描画サイクルごとに均一にするためにテクスチャユニット番号を渡す必要があることがわかりました。すべてが正常に機能します。本当に必要ですか?
ありがとうございました