簡體   English   中英

編程生成OpenGL紋理並將其應用到OpenGL視圖

[英]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); 

沒有按照您的想象做。 widthheight參數的類型為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錯誤,參數為:

targetlevelxoffsetyoffsetwidthheight

您基本上跳過了該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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM