我只是想知道如何转换SDL_Surface(通过IMG_Load从png加载)并将其粘贴在四边形上.这就是我所拥有的(大多数只是从我发现的教程中粘贴的复制品).
#include "SDL.h"
#include "SDL_opengl.h"
#include "SDL_image.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
SDL_Surface *screen;
// Slightly different SDL initialization
if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) {
printf("Unable to initialize SDL: %s\n", SDL_GetError());
return 1;
}
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); // *new*
screen = SDL_SetVideoMode( 640, 480, 16, SDL_OPENGL ); // *changed*
if ( !screen ) {
printf("Unable to set video mode: %s\n", SDL_GetError());
return 1;
}
// Set the OpenGL state after creating the context with SDL_SetVideoMode …
Run Code Online (Sandbox Code Playgroud) 我目前工作的一个二维"百战天虫"克隆在XNA,和的特点之一是"可变形的"地形(例如,当火箭击中地形,有爆炸和地形的一大块消失).
我目前这样做的方法是使用一个纹理,当它接近中心时,红色值逐渐变高.我循环遍历"变形"纹理的每个像素,如果当前像素与地形像素重叠并且具有足够高的红色值,我将表示地形的颜色数组修改为透明.如果当前像素的红色值不够高,则会使地形颜色变黑(红色值越接近阈值,颜色越黑).在这个操作结束时,我使用SetData来更新我的地形纹理.
我知道这是不是做的好方法,这不仅是因为我看了一下管道摊位等,但也因为如果在同一时间被增加了很多陨石坑它可能会变得非常laggy.我想在GPU上重新制作我的Crater Generation,而不是在目标和要修改的纹理之间使用渲染目标"ping-ponging".这不是问题,我知道该怎么做.问题是我不知道如何使用此方法保持我的刻录效果.
以下是刻录效果现在的样子:
烧伤效果http://i52.tinypic.com/2h6f2nt.png
有没有人知道我将如何创建类似的燃烧效果(使形成的火山口周围的边缘变暗)?我对Shaders完全不熟悉,但如果它需要它,如果有人带我了解如何做,我会非常感激.如果有任何其他方式也会很棒.
如何关闭多个纹理单元,因为它们会影响其他渲染部件.我激活他们:
glActiveTexture(GL_TEXTURE0 + index);
glBindTexture(GL_TEXTURE_2D,
((MaterialSampler2D)specular).texture.getTOB());
shader.setTexture2(index);
Run Code Online (Sandbox Code Playgroud)
有没有类似glDeactivateTexture的东西?
我一直在开发一个需要渲染程序天空的应用程序,我的意思是天空有一个夜晚周期,根据模拟中的时间而变化.
我已经看到在过去,他们有一个地方的方法颜色表 sush为这样的:
现在取决于某些变量,例如时间,代码扫描图像并使用一系列颜色作为天空纹理.此外,在日出/日落期间,代码将扫描为右侧的黄色,橙色,红色.
我不确定这是什么,但我认为这就是我所追求的.我很乐意,如果有人会告诉我或指出我使用opengl和C++这种技术的例子.
在侧面说明我的天空盒不是你的平均形状,它更像是天空直角,如下所示
正如你所看到的那样,天空右上角没有顶部,只有你看到的两个蓝色边将呈现天空(黑色是BG).我想知道是否有任何方法可以在这两个平原上渲染一个程序/动态的夜空(没有它们之间的缝隙也很明显)并且作为一个侧面问题也有它所以平原的顶部淡出与α-无论其夜间或白天
关于如何扫描色彩图然后在OpenGL/C++中将其设置为纹理的任何解释/示例都非常感谢.
在OpenGL 2.1+中我们需要glEnable(GL_TEXTURE)
在使用纹理之前调用吗?如果我们遇到纹理问题,可能是什么原因?
更新:
我正在使用OpenGL 2.1 for Desktop,我的步骤是:
加载bmp 24位图像(我在gDebuger中检查它显示我的纹理正常,所以我确定我的加载图像程序没有失败).
在程序中调用几个OpenGL函数init()
:
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image_width, image_height, 0, GL_BGR, GL_UNSIGNED_BYTE, image_data);
Run Code Online (Sandbox Code Playgroud)在draw_scene()中:
glUseProgram(program);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture_id);
glUniform1i(uniform_texture, 0);
...
Run Code Online (Sandbox Code Playgroud)顶点着色器(版本120):
attribute vec3 vPos;
attribute vec2 vTexCoord;
uniform mat4 MV;
uniform mat4 Projection;
varying vec2 fragTexCoord;
void main()
{
fragTexCoord = vTexCoord;
gl_Position = Projection * MV * vPos;
}
Run Code Online (Sandbox Code Playgroud)片段着色器:
uniform sampler2D my_texture;
varying vec2 fragTexCoord;
void main() …
Run Code Online (Sandbox Code Playgroud)我在我的terrain的片段着色器中使用纹理混合来从一个纹理混合到下一个纹理.在仅使用我的草纹理和在泥土/草地或雪/草纹理之间混合的缝隙处,mipmaps似乎会造成难看的缝隙(见下图).禁用mipmapping可以解决问题但会使我的地形在远处变得非常颗粒状/丑陋.有没有办法在不禁用mipmapping的情况下消除这种接缝?
地形vs.glsl:
precision mediump float;
attribute vec3 Position;
attribute vec2 TextureCoord;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
varying vec2 texCoord;
varying float y;
void main(void) {
gl_Position = uPMatrix * uMVMatrix * vec4(Position, 1.0);
texCoord = TextureCoord;
y = Position.y;
}
Run Code Online (Sandbox Code Playgroud)
地形fs.glsl:
precision mediump float;
uniform sampler2D dirt_texture;
uniform sampler2D grass_texture;
uniform sampler2D snow_texture;
varying vec2 texCoord;
varying float y;
void main(void) {
if (y < -5.0) {
gl_FragColor = texture2D(dirt_texture, texCoord);
} else if (y < 0.0) {
gl_FragColor …
Run Code Online (Sandbox Code Playgroud) 我正在学习cuda纹理记忆。现在,我得到了一个opencv Iplimage,并且得到了它的图像数据。然后,将纹理绑定到此uchar数组,如下所示:
Iplimage *image = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
unsigned char* imageDataArray = (unsigned char*)image->imagedata;
texture<unsigned char,2,cudaReadModeElementType> tex;
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(8, 8, 8, 0,
cudaChannelFormatKindUnsigned);
cudaArray *cuArray = NULL;
CudaSafeCall(cudaMallocArray(&cuArray,&channelDesc,width,height));
cudaMemcpy2DToArray(cuArray,0,0,imageDataArray,image->widthstep,
width * sizeof(unsigned char), height, cudaMemcpyHostToDevice);
cudaBindTextureToArray(texC1_cf,cuArray_currentFrame, channelDesc);
Run Code Online (Sandbox Code Playgroud)
现在,我启动内核,并希望访问该图像的每个像素,每个通道。这就是我感到困惑的地方。
我使用以下代码获取像素坐标(X,Y):
int X = (blockIdx.x*blockDim.x+threadIdx.x);
int Y = (blockIdx.y*blockDim.y+threadIdx.y);
Run Code Online (Sandbox Code Playgroud)
以及如何访问此(X,Y)的每个通道?return下面的代码是什么?
tex2D(tex, X, Y);
Run Code Online (Sandbox Code Playgroud)
除此之外,您能告诉我如何使用纹理访问数组的纹理内存以及此变换的外观吗?
我试图用opengl在Qt中显示一个纹理,但是当我运行时它只是没有显示纹理.
我做了一些研究,发现我需要将纹理的高度和宽度设为2的幂.我的纹理现在是(1024x1024).
我还添加了很多可以解决我的问题的glTexParameterf,但仍然没有运气.
void WorldView::paintGL ()
{
this->dayOfYear = (this->dayOfYear+1);
this->hourOfDay = (this->hourOfDay+1) % 24;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// store current matrix
glMatrixMode( GL_MODELVIEW );
glPushMatrix( );
gluLookAt(camPosx ,camPosy ,camPosz,
camViewx,camViewy,camViewz,
camUpx, camUpy, camUpz );
//Draw Axes
glDisable( GL_LIGHTING );
glBegin(GL_LINES);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(10.0, 0.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 10.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 10.0);
glEnd();
//load texture
QImage img;
if(!img.load(":/files/FloorsCheckerboardSmall.bmp"))
printf("could not open image");
//try …
Run Code Online (Sandbox Code Playgroud) 我正在重构基于iOS OpenGL的渲染管道。我的管道包含许多渲染步骤,因此我需要很多中间纹理来渲染和读取。这些纹理具有各种类型(无符号字节和半浮点数),并且可能具有不同数量的通道。
为了节省内存和分配工作,我回收了管道中先前步骤使用的纹理,不再需要这些纹理。在我以前的实现中,我是自己做的。
在我的新实现中,我想使用Core Video框架提供的API。特别是因为它们提供了从CPU对纹理内存的更快访问。我知道CVOpenGLESTextureCache
允许我从CVPixelBuffer
s中创建OpenGL纹理,可以直接创建或使用CVPixelBufferPool
。但是,我找不到任何描述它们如何真正发挥作用以及如何共同发挥作用的文档。
这是我想知道的事情:
CVOpenGLESTextureCache
我总是需要提供一个像素缓冲区。如果仍然需要提供内存并且无法检索旧的未使用的纹理,为什么将其称为“缓存”?CVOpenGLESTextureCacheFlush
功能“目前刷新未使用的资源”。缓存如何知道资源是否“未使用”?发布相应的纹理后,纹理会返回到缓存CVOpenGLESTextureRef
吗?相同的问题适用于CVPixelBufferPool
。CVPixelBufferPool
似乎只能管理相同大小和类型的缓冲区。这意味着我需要为我使用的每种纹理配置创建一个专用池,对吗?如果至少可以澄清其中一些问题,我将非常高兴。
在我的游戏中,我在四边形上使用简单的纹理.我可以看到统一的GUI让我们通过设置"图像类型"选项,切片图像切片.
我想对我在四边形中使用的其他纹理做同样的事情.
简单来说,我不希望在缩放纹理本身时缩放纹理的边缘.
谢谢.