[英]Applying color to a OpenGL ES 2.0 Point Sprite texture in Fragment shader?
[英]Progmatically generating and applying an OpenGL texture to a OpenGL View
好的,所以我一直在嘗試解決這個問題,我設法在OpenGLView上創建了子類,並繪制了一些形狀(正方形,三角形),並讓它們更改了顏色等。
現在,我正在嘗試找出如何加載紋理數據並進行渲染的方法,但是我有點迷失了。
這是我嘗試使用的代碼,它似乎沒有加載任何紋理,我最終得到一個白色框。 我應該相信可以創建黑白棋盤格效果,但是我似乎無法使其正常工作。
這是代碼,不勝感激!
#import "MyOpenGLView.h"
#import <OpenGL/gl.h>
@implementation MyOpenGLView
static void drawAnObject ()
{
glEnable(GL_TEXTURE_2D);
GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glPixelStorei(GL_UNPACK_ALIGNMENT, tex);
// Black/white checkerboard
float pixels[] = {
0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f
};
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
float color[] = { 1.0f, 0.0f, 0.0f, 1.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, color);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0.1, 0.1, 0, GL_RGB, GL_FLOAT, pixels);
glBindTexture (GL_TEXTURE_2D, tex);
glBegin (GL_QUADS);
glTexCoord2f (0.0, 0.0);
glVertex3f (0.0, 0.0, 0.0);
glTexCoord2f (1.0, 0.0);
glVertex3f (10.0, 0.0, 0.0);
glTexCoord2f (1.0, 1.0);
glVertex3f (10.0, 10.0, 0.0);
glTexCoord2f (0.0, 1.0);
glVertex3f (0.0, 10.0, 0.0);
glEnd ();
}
-(void)awakeFromNib
{
renderTimer = [NSTimer timerWithTimeInterval:0.001 //a 1ms time interval
target:self
selector:@selector(timerFired:)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:renderTimer
forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:renderTimer
forMode:NSEventTrackingRunLoopMode]; //Ensure timer fires during resize
}
// Timer callback method
- (void)timerFired:(id)sender
{
[self setNeedsDisplay:YES];
}
- (void)drawRect:(NSRect)dirtyRect {
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
drawAnObject();
glFlush();
GLint swapInterval = 1;
[[self openGLContext] setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval];
CVDisplayLinkCreateWithActiveCGDisplays(&displayLink);
}
原版的
我正在尋找針對OS X的Cocoa應用程序,其中我有一個矩形(大約500px x 500px),我需要在25fps左右更改每個像素的顏色。
每個像素的顏色值將存儲在NSDictionary中,可以在渲染每個像素時從中讀取。
從最基本的意義上講,我可以將正在繪制的View子類化,並覆蓋drawRect方法。 但是,我隨后需要每秒調用25次,並且我懷疑這要求太多了,而且會陷入困境,它也不保證渲染將在正確的時間進行。
Soi認為我需要使用Core Graphics或OpenGL在較低的級別上執行此操作,但是這些都是我以前沒有花很多時間的大量主題。 因此,在我深入研究其中一個之前,是否有正確的方向指示?
線
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0.1, 0.1, 0, GL_RGB, GL_FLOAT, pixels);
沒有按照您的想象做。 width
和height
參數的類型為GLsizei
,它是一個整數類型-您應該在此處設置紋理的像素尺寸 。 將其設置為0.1
,它將隱式轉換為整數並最終為0。顯然,此處應將2和2用於2 x 2紋理。
調用glPixelStorei(GL_UNPACK_ALIGNMENT, tex);
現在,根本沒有任何意義,因為tex
只是GL實現隨機分配的某個數字(或多或少),並且您不需要將解壓縮對齊設置為任何東西。 由於您將float
用作基本數據類型(從性能的角度來看,您可能不應該這樣做-但這是另一回事了),因此默認的4字節對齊將可以正常工作。
即使您修復了該問題,紋理也不會顯示,因為它不是_mipmap完整的。 默認的縮小過濾器是GL_NEAREST_MIPMAP_LINEAR
。 如果您不想使用mipmapping,則必須相應地設置過濾器模式:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // or GL_LINEAR
我看到的第三個問題是,每次調用drawAnObject()
,您都將創建一個新的紋理對象 ,但從未刪除它-隨着時間的流逝,它將泄漏內存。
您應該考慮何時要創建紋理以及該紋理應具有的生命周期。 無需重新創建對象即可更改圖像數據。
更新以回答問題中的UPTATE2:
您使用glTexSubImage2D
錯誤,參數為:
target
, level
, xoffset
, yoffset
, width
, height
。
您基本上跳過了該level
並在height
位置插入了另一個0
,因此您嘗試更新4 by 0子區域。 正確的電話當然是
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_FLOAT, cpixelArray);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.