标签: texture2d

如何将多个纹理传递到单个着色器?

我使用freeglut,GLEW 和魔鬼,以呈现纹理的茶壶使用顶点和片段着色器.这在Ubuntu 14.04上的OpenGL 2.0和GLSL 1.2中都运行良好.

现在,我想将凹凸贴图应用于茶壶.我的讲师显然不会酿造他自己的茶,所以不知道他们应该是顺利的.无论如何,我找到了一个关于老式凹凸贴图的漂亮教程,其中包括一个片段着色器,它开始于:

uniform sampler2D DecalTex; //The texture
uniform sampler2D BumpTex; //The bump-map 
Run Code Online (Sandbox Code Playgroud)

他们没有提到的是如何将两个纹理首先传递给着色器.

以前我

//OpenGL cpp file
glBindTexture(GL_TEXTURE_2D, textureHandle);

//Vertex shader
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;

//Fragment shader
gl_FragColor = color * texture2D(DecalTex,gl_TexCoord[0].xy);
Run Code Online (Sandbox Code Playgroud)

所以现在我

//OpenGL cpp file
glBindTexture(GL_TEXTURE_2D, textureHandle);
glBindTexture(GL_TEXTURE_2D, bumpHandle);

//Vertex shader
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord1;

//Fragment shader
gl_FragColor = color * texture2D(BumpTex,gl_TexCoord[0].xy);
//no bump logic yet, just testing I …
Run Code Online (Sandbox Code Playgroud)

opengl glsl texture-mapping texture2d opengl-2.0

21
推荐指数
1
解决办法
2万
查看次数

将Sprite对象数组合成一个Sprite - Unity

我在Unity中有一组Sprite对象.它们的大小取决于加载的图像.我想将它们像平铺地图并排组合成一个图像.我希望它们的布局就像你正在形成一排图像,一个接一个.(注意:没有一个在另一个之上)我怎么能这样做?

我正在组合的原因(仅适用于那些想知道的人)是因为我正在使用polygon2D Collider.由于当我并排使用多个碰撞器时发生了一些奇怪的行为,我决定在添加一个大的多边形碰撞器之前组合图像.请注意,这些事情发生在运行时.我不能只创建一个大图像并加载,因为图像的顺序只在运行时确定.

我希望能得到一些帮助.谢谢.

c# textures sprite texture2d unity-game-engine

12
推荐指数
1
解决办法
7341
查看次数

glTexImage2d和Null数据

这是一个奇怪的问题,但我想知道为什么glTexImage2d关心像素数据类型和Null数据的格式.glTexImage2d的签名是......

void glTexImage2D( GLenum target, GLint level, GLint internalFormat, 
           GLsizei width, GLsizei height, GLint border, GLenum format, 
           GLenum type, const GLvoid * data);
Run Code Online (Sandbox Code Playgroud)

internalFormat用于告诉图形驱动程序您要在gpu上存储数据,格式和类型告诉图形驱动程序对GLvoid*数据的期望.所以,如果我没有传递任何数据,例如通过传递null,为什么图形驱动程序会关心格式和类型是什么?所以这是一个奇怪的问题,因为有时它不会.它的时间,我没有检查每一次迭代但是,特别是在制作深度纹理时,或者我最近遇到的是整数类型,如GL_RED_INTEGER,GL_RG_INTEGER等和/或它们对应的内部格式如GL_R8I,GL_RGBA32UI.然而,任何"简单"类型都不必与internalFormat相对应,如GL_RGBA8,GL_RGBA32F等.出于某种原因,即使您没有通过,以前的特定数据类型和格式也必须精确任何数据.这是为什么?

c c++ opengl texture2d

11
推荐指数
2
解决办法
2040
查看次数

XNA在运行时绘制/绘制到Texture2D上

早上好(如果早上你在哪里)

我一直在环顾四周,并没有看到一个令人满意的方法这样做,以为我会问周围...

理想的世界我希望能够生成透明的Texture2D对象.将其绘制到屏幕上我希望能够"绘制"它,即当鼠标左键按下时,光标所在的任何像素都应该设置为黑色.接下来,我需要能够使用这个纹理.

使用纹理是很容易的部分,我们可以简单地为"绘画"对象创建一个新的Texture2D属性,并在SpriteBatch.Draw方法中使用它.两个棘手的部分是

  1. 生成指定大小的texture2D对象,在代码中填充透明度.
  2. 即时编辑texture2D(即能够改变像素颜色)

如果有人有这些经验,你会非常感激.

xna textures texture2d xna-4.0

10
推荐指数
1
解决办法
5969
查看次数

纹理记忆 - tex2D基础知识

在使用纹理内存时,我遇到了以下代码: -

uint f = (blockIdx.x * blockDim.x) + threadIdx.x;
uint c = (blockIdx.y * blockDim.y) + threadIdx.y;

uint read = tex2D( refTex, c+0.5f, f+0.5f);
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么我们添加0.5f到两个cf?这让我感到困惑..谢谢你

cuda texture2d

10
推荐指数
1
解决办法
1万
查看次数

glBindImageTexture()和glBindTexture()有什么区别?

glBindImageTexture和glBindTexture有什么区别?并且着色器中的以下声明之间的区别是什么:

layout (binding = 0, rgba32f) uniform image2D img_input;
Run Code Online (Sandbox Code Playgroud)

uniform sampler2D img_input;
Run Code Online (Sandbox Code Playgroud)

opengl texture2d glteximage2d

10
推荐指数
1
解决办法
2650
查看次数

有没有从XNA中的Bitmap对象创建Texture2D的快速替代方法?

我已经环顾了很多,我发现从Bitmap创建Texture2D的唯一方法是:

using  (MemoryStream s = new  MemoryStream())
{
   bmp.Save(s, System.Drawing.Imaging.ImageFormat.Png);
   s.Seek(0, SeekOrigin.Begin);
   Texture2D tx = Texture2D.FromFile(device, s);
}
Run Code Online (Sandbox Code Playgroud)

Texture2D tx = new Texture2D(device, bmp.Width, bmp.Height,
                        0, TextureUsage.None, SurfaceFormat.Color);
tx.SetData<byte>(rgbValues, 0, rgbValues.Length, SetDataOptions.NoOverwrite);
Run Code Online (Sandbox Code Playgroud)

其中rgbValues是一个字节数组,包含32位ARGB格式的位图像素数据.

我的问题是,我可以尝试更快的方法吗?

我正在编写一个地图编辑器,它必须读取自定义格式图像(地图图块)并将它们转换为Texture2D纹理才能显示.以前版本的编辑器是一个C++实现,它首先将图像转换为位图,然后转换为使用DirectX绘制的纹理.我在这里尝试了相同的方法,但是上述两种方法都非常慢.要加载到内存中,映射所需的所有纹理都需要第一个方法~250秒,而第二个方法在合理的规格计算机上需要110秒(为了比较,C++代码需要大约5秒钟).如果有一种方法可以直接编辑纹理数据(例如使用Bitmap类'

任何帮助将非常感谢.

谢谢

c# xna bitmap texture2d

9
推荐指数
2
解决办法
1万
查看次数

写入RenderTarget后,如何有效地克隆输出?

XNA noob在这里,每天都在学习.我刚刚研究了如何使用RenderTarget2D将多个纹理合成为一个.然而,虽然我可以将RenderTarget2D用作Texture2D用于大多数目的,但是有一个关键的区别:当后缓冲区调整大小时这些渲染的纹理会丢失(毫无疑问,在其他情况下,例如内存不足的图形设备).

目前,我只是将完成的RenderTarget2D复制到一个新的非易失性Texture2D对象中.不过,我这样做的代码非常难看.有没有更优雅的方式来做到这一点?也许我只是累了,但我无法在Google或SO上找到答案.

略有简化:

public static Texture2D  MergeTextures(int width, int height, IEnumerable<Tuple<Texture2D, Color>> textures)
    {
    RenderTarget2D  buffer = new RenderTarget2D(_device, width, height);

    _device.SetRenderTarget(buffer);
    _device.Clear(Color.Transparent);

    SpriteBatch  spriteBatch = new SpriteBatch(_device);
    spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied);

    // Paint each texture over the one before, in the appropriate color
    Rectangle  rectangle = new Rectangle(0, 0, width, height);
    foreach (Tuple<Texture2D, Color> texture in textures)
        spriteBatch.Draw(texture.Item1, rectangle, texture.Item2);

    spriteBatch.End();
    _device.SetRenderTarget((RenderTarget2D)null);

    // Write the merged texture to a Texture2D, so we don't lose it when resizing the back buffer …
Run Code Online (Sandbox Code Playgroud)

c# xna texture2d render-to-texture

9
推荐指数
1
解决办法
4405
查看次数

在Unity的C#中无阻塞加载和复制大型Texture2D

我正在为Android构建一个Unity应用程序,它可以动态加载大量的大纹理(所有图像的大小都超过6MB).这些纹理可以来自Amazon S3服务器,在这种情况下它们以流的形式出现,或者来自用户的设备本身.

在这两种情况下,我都可以异步地保持原始数据或纹理而不会出现问题.在第一个我查询服务器并获得带有数据流的回调,在第二个我使用WWW类来获取使用"file://"协议的纹理.

一旦我想将这些数据复制到Texture2D到我可以使用的某个地方,例如在Texture2D私有成员上,问题就会发生.

使用流我将其转换为byte []并尝试调用LoadImage(),而使用WWW类我只需尝试使用myTexture = www.texture进行复制.在纹理加载或复制时,我都会得到一个巨大的帧.我想彻底根除这个框架,因为App简直无法发布.

using (var stream = responseStream)
{
   byte[] myBinary = ToByteArray(stream);
   m_myTexture.LoadImage(myBinary);  // Commenting this line removes frame out
}

...

WWW www = new WWW("file://" + filePath);
yield return www;
m_myTexture = www.texture;  // Commenting this line removes frame out
Run Code Online (Sandbox Code Playgroud)

不幸的是,Unity似乎不喜欢在主线程的单独线程上运行这些操作,并在我尝试时抛出异常.

有没有什么方法可以将这些操作分块,以便需要多个帧?或者做一些不会拖延主线程的快速memcopy操作?

提前致谢!

PS:我在以下回购中创建了一个问题的工作示例:https://github.com/NeoSouldier/Texture2DTest/

c# performance android texture2d unity-game-engine

9
推荐指数
2
解决办法
4714
查看次数

通过代码使Unity中的Texture2D可读

我有一些AssetBundles,我想转换为.png图像文件.

它们是Texture2D资产,但问题是它们不是Read Enable,当我尝试将它们转换为带有的PNG时

var _bytes = _texture2d.EncodeToPNG();
Run Code Online (Sandbox Code Playgroud)

命令,我收到以下错误信息:

纹理'纹理名称'不可读,无法从脚本访问纹理内存.您可以在纹理导入设置中使纹理可读.

我真的无法访问纹理导入设置,因为它们来自资产包,一切都是用代码制作的.

有人有解决方法吗?

谢谢

c# texture2d unity-game-engine

8
推荐指数
2
解决办法
2万
查看次数