OpenGL - Simple 2D Texture Not Being Displayed
up vote
1
down vote
favorite
I have written a very simple OpenGL program using glfw and glew. It compiles fine and runs, but the simple texture I am passing to the fragment shader is not being displayed.
The only geometry is a single quad.
I am only trying to display a single solid color, the first element of the texture. I know that the fragment shader works at all because I can display a solid color without the texture:
#version 320 es
mediump out vec4 color;
precision mediump float;
precision mediump sampler2D;
in vec2 texCoord;
uniform sampler2D tex;
void main() {
color = vec4(0.5, 0.75, 0.5, 1.0);
}
However, when I use the texture sampler I get nothing, like the sampler is sampling only 0s (changing only main()
):
void main() {
color = vec4(texture(tex, vec2(0, 0)).rgb, 1);
}
I am populating and generating the texture in what I believe is the correct manner (TEX_SIZE
is defined as #define TEX_SIZE (32*32)
):
//Texture Data
GLfloat texData[TEX_SIZE * 3] = {1.0};
//Create texture
GLuint tex;
glGenTextures(1, &tex);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_FLOAT, texData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT);
And here is the entire draw loop:
//Render loop
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS
&& !glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(programID);
//Texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glUniform1i(glGetUniformLocation(programID, "tex"), 0);
//Draw the quad
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, gVertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, gIndices);
glDisableClientState(GL_VERTEX_ARRAY);
if (glGetError()) {
puts((char *)glewGetErrorString(glGetError()));
}
glfwSwapBuffers(window);
glfwPollEvents();
}
Why is this happening? I'm totally stuck.
EDIT: Changed the array initialization, as per suggestion:
//Texture Data
GLfloat texData[TEX_SIZE * 3];
for (int i = 0; i < TEX_SIZE * 3; i++) {
texData[i] = 1.0;
}
There was no change. Output is still all black.
c++ opengl-es textures
|
show 10 more comments
up vote
1
down vote
favorite
I have written a very simple OpenGL program using glfw and glew. It compiles fine and runs, but the simple texture I am passing to the fragment shader is not being displayed.
The only geometry is a single quad.
I am only trying to display a single solid color, the first element of the texture. I know that the fragment shader works at all because I can display a solid color without the texture:
#version 320 es
mediump out vec4 color;
precision mediump float;
precision mediump sampler2D;
in vec2 texCoord;
uniform sampler2D tex;
void main() {
color = vec4(0.5, 0.75, 0.5, 1.0);
}
However, when I use the texture sampler I get nothing, like the sampler is sampling only 0s (changing only main()
):
void main() {
color = vec4(texture(tex, vec2(0, 0)).rgb, 1);
}
I am populating and generating the texture in what I believe is the correct manner (TEX_SIZE
is defined as #define TEX_SIZE (32*32)
):
//Texture Data
GLfloat texData[TEX_SIZE * 3] = {1.0};
//Create texture
GLuint tex;
glGenTextures(1, &tex);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_FLOAT, texData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT);
And here is the entire draw loop:
//Render loop
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS
&& !glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(programID);
//Texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glUniform1i(glGetUniformLocation(programID, "tex"), 0);
//Draw the quad
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, gVertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, gIndices);
glDisableClientState(GL_VERTEX_ARRAY);
if (glGetError()) {
puts((char *)glewGetErrorString(glGetError()));
}
glfwSwapBuffers(window);
glfwPollEvents();
}
Why is this happening? I'm totally stuck.
EDIT: Changed the array initialization, as per suggestion:
//Texture Data
GLfloat texData[TEX_SIZE * 3];
for (int i = 0; i < TEX_SIZE * 3; i++) {
texData[i] = 1.0;
}
There was no change. Output is still all black.
c++ opengl-es textures
1
Do you bind the texture-unit 0 totex
in your shader?
– tkausl
16 hours ago
@tkausl My whole frag shader is pasted above, so I guess not? How do I do that?
– bpmw
16 hours ago
1
Your shader loading code is not, however. You do it the same way you'd set other uniforms, just set a int (0
in this case) to the uniformtex
. Your error-handling is broken by the way, it ignores the first error it sees.
– tkausl
16 hours ago
@tkausl here is my loading code. What function do I need to use to bind my uniform to 0?
– bpmw
16 hours ago
1
@tkausl But am I not already doing that in the render loop withglUniform1i(glGetUniformLocation(programID, "tex"), 0);
?
– bpmw
16 hours ago
|
show 10 more comments
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I have written a very simple OpenGL program using glfw and glew. It compiles fine and runs, but the simple texture I am passing to the fragment shader is not being displayed.
The only geometry is a single quad.
I am only trying to display a single solid color, the first element of the texture. I know that the fragment shader works at all because I can display a solid color without the texture:
#version 320 es
mediump out vec4 color;
precision mediump float;
precision mediump sampler2D;
in vec2 texCoord;
uniform sampler2D tex;
void main() {
color = vec4(0.5, 0.75, 0.5, 1.0);
}
However, when I use the texture sampler I get nothing, like the sampler is sampling only 0s (changing only main()
):
void main() {
color = vec4(texture(tex, vec2(0, 0)).rgb, 1);
}
I am populating and generating the texture in what I believe is the correct manner (TEX_SIZE
is defined as #define TEX_SIZE (32*32)
):
//Texture Data
GLfloat texData[TEX_SIZE * 3] = {1.0};
//Create texture
GLuint tex;
glGenTextures(1, &tex);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_FLOAT, texData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT);
And here is the entire draw loop:
//Render loop
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS
&& !glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(programID);
//Texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glUniform1i(glGetUniformLocation(programID, "tex"), 0);
//Draw the quad
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, gVertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, gIndices);
glDisableClientState(GL_VERTEX_ARRAY);
if (glGetError()) {
puts((char *)glewGetErrorString(glGetError()));
}
glfwSwapBuffers(window);
glfwPollEvents();
}
Why is this happening? I'm totally stuck.
EDIT: Changed the array initialization, as per suggestion:
//Texture Data
GLfloat texData[TEX_SIZE * 3];
for (int i = 0; i < TEX_SIZE * 3; i++) {
texData[i] = 1.0;
}
There was no change. Output is still all black.
c++ opengl-es textures
I have written a very simple OpenGL program using glfw and glew. It compiles fine and runs, but the simple texture I am passing to the fragment shader is not being displayed.
The only geometry is a single quad.
I am only trying to display a single solid color, the first element of the texture. I know that the fragment shader works at all because I can display a solid color without the texture:
#version 320 es
mediump out vec4 color;
precision mediump float;
precision mediump sampler2D;
in vec2 texCoord;
uniform sampler2D tex;
void main() {
color = vec4(0.5, 0.75, 0.5, 1.0);
}
However, when I use the texture sampler I get nothing, like the sampler is sampling only 0s (changing only main()
):
void main() {
color = vec4(texture(tex, vec2(0, 0)).rgb, 1);
}
I am populating and generating the texture in what I believe is the correct manner (TEX_SIZE
is defined as #define TEX_SIZE (32*32)
):
//Texture Data
GLfloat texData[TEX_SIZE * 3] = {1.0};
//Create texture
GLuint tex;
glGenTextures(1, &tex);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_FLOAT, texData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT);
And here is the entire draw loop:
//Render loop
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS
&& !glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(programID);
//Texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glUniform1i(glGetUniformLocation(programID, "tex"), 0);
//Draw the quad
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, gVertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, gIndices);
glDisableClientState(GL_VERTEX_ARRAY);
if (glGetError()) {
puts((char *)glewGetErrorString(glGetError()));
}
glfwSwapBuffers(window);
glfwPollEvents();
}
Why is this happening? I'm totally stuck.
EDIT: Changed the array initialization, as per suggestion:
//Texture Data
GLfloat texData[TEX_SIZE * 3];
for (int i = 0; i < TEX_SIZE * 3; i++) {
texData[i] = 1.0;
}
There was no change. Output is still all black.
c++ opengl-es textures
c++ opengl-es textures
edited 16 hours ago
asked 16 hours ago
bpmw
789
789
1
Do you bind the texture-unit 0 totex
in your shader?
– tkausl
16 hours ago
@tkausl My whole frag shader is pasted above, so I guess not? How do I do that?
– bpmw
16 hours ago
1
Your shader loading code is not, however. You do it the same way you'd set other uniforms, just set a int (0
in this case) to the uniformtex
. Your error-handling is broken by the way, it ignores the first error it sees.
– tkausl
16 hours ago
@tkausl here is my loading code. What function do I need to use to bind my uniform to 0?
– bpmw
16 hours ago
1
@tkausl But am I not already doing that in the render loop withglUniform1i(glGetUniformLocation(programID, "tex"), 0);
?
– bpmw
16 hours ago
|
show 10 more comments
1
Do you bind the texture-unit 0 totex
in your shader?
– tkausl
16 hours ago
@tkausl My whole frag shader is pasted above, so I guess not? How do I do that?
– bpmw
16 hours ago
1
Your shader loading code is not, however. You do it the same way you'd set other uniforms, just set a int (0
in this case) to the uniformtex
. Your error-handling is broken by the way, it ignores the first error it sees.
– tkausl
16 hours ago
@tkausl here is my loading code. What function do I need to use to bind my uniform to 0?
– bpmw
16 hours ago
1
@tkausl But am I not already doing that in the render loop withglUniform1i(glGetUniformLocation(programID, "tex"), 0);
?
– bpmw
16 hours ago
1
1
Do you bind the texture-unit 0 to
tex
in your shader?– tkausl
16 hours ago
Do you bind the texture-unit 0 to
tex
in your shader?– tkausl
16 hours ago
@tkausl My whole frag shader is pasted above, so I guess not? How do I do that?
– bpmw
16 hours ago
@tkausl My whole frag shader is pasted above, so I guess not? How do I do that?
– bpmw
16 hours ago
1
1
Your shader loading code is not, however. You do it the same way you'd set other uniforms, just set a int (
0
in this case) to the uniform tex
. Your error-handling is broken by the way, it ignores the first error it sees.– tkausl
16 hours ago
Your shader loading code is not, however. You do it the same way you'd set other uniforms, just set a int (
0
in this case) to the uniform tex
. Your error-handling is broken by the way, it ignores the first error it sees.– tkausl
16 hours ago
@tkausl here is my loading code. What function do I need to use to bind my uniform to 0?
– bpmw
16 hours ago
@tkausl here is my loading code. What function do I need to use to bind my uniform to 0?
– bpmw
16 hours ago
1
1
@tkausl But am I not already doing that in the render loop with
glUniform1i(glGetUniformLocation(programID, "tex"), 0);
?– bpmw
16 hours ago
@tkausl But am I not already doing that in the render loop with
glUniform1i(glGetUniformLocation(programID, "tex"), 0);
?– bpmw
16 hours ago
|
show 10 more comments
1 Answer
1
active
oldest
votes
up vote
1
down vote
accepted
The initial value of GL_TEXTURE_MIN_FILTER
is GL_NEAREST_MIPMAP_LINEAR
. But you don't generate mipmaps. This causes that the texture is not complete.
OpenGL ES 3.2 Specification; 8.17 Texture Completeness; page 205
A texture is said to be complete if all the texture images and texture parameters
required to utilize the texture for texture application are consistently defined.
... a texture is complete unless any of the following
conditions hold true:
- The minification filter requires a mipmap (is neither
NEAREST
norLINEAR
),
and the texture is not mipmap complete.
Change the texture minification filter (glTexParameteri
) to solve your issue:
e.g.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
The initial value of GL_TEXTURE_MIN_FILTER
is GL_NEAREST_MIPMAP_LINEAR
. But you don't generate mipmaps. This causes that the texture is not complete.
OpenGL ES 3.2 Specification; 8.17 Texture Completeness; page 205
A texture is said to be complete if all the texture images and texture parameters
required to utilize the texture for texture application are consistently defined.
... a texture is complete unless any of the following
conditions hold true:
- The minification filter requires a mipmap (is neither
NEAREST
norLINEAR
),
and the texture is not mipmap complete.
Change the texture minification filter (glTexParameteri
) to solve your issue:
e.g.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
add a comment |
up vote
1
down vote
accepted
The initial value of GL_TEXTURE_MIN_FILTER
is GL_NEAREST_MIPMAP_LINEAR
. But you don't generate mipmaps. This causes that the texture is not complete.
OpenGL ES 3.2 Specification; 8.17 Texture Completeness; page 205
A texture is said to be complete if all the texture images and texture parameters
required to utilize the texture for texture application are consistently defined.
... a texture is complete unless any of the following
conditions hold true:
- The minification filter requires a mipmap (is neither
NEAREST
norLINEAR
),
and the texture is not mipmap complete.
Change the texture minification filter (glTexParameteri
) to solve your issue:
e.g.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
add a comment |
up vote
1
down vote
accepted
up vote
1
down vote
accepted
The initial value of GL_TEXTURE_MIN_FILTER
is GL_NEAREST_MIPMAP_LINEAR
. But you don't generate mipmaps. This causes that the texture is not complete.
OpenGL ES 3.2 Specification; 8.17 Texture Completeness; page 205
A texture is said to be complete if all the texture images and texture parameters
required to utilize the texture for texture application are consistently defined.
... a texture is complete unless any of the following
conditions hold true:
- The minification filter requires a mipmap (is neither
NEAREST
norLINEAR
),
and the texture is not mipmap complete.
Change the texture minification filter (glTexParameteri
) to solve your issue:
e.g.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
The initial value of GL_TEXTURE_MIN_FILTER
is GL_NEAREST_MIPMAP_LINEAR
. But you don't generate mipmaps. This causes that the texture is not complete.
OpenGL ES 3.2 Specification; 8.17 Texture Completeness; page 205
A texture is said to be complete if all the texture images and texture parameters
required to utilize the texture for texture application are consistently defined.
... a texture is complete unless any of the following
conditions hold true:
- The minification filter requires a mipmap (is neither
NEAREST
norLINEAR
),
and the texture is not mipmap complete.
Change the texture minification filter (glTexParameteri
) to solve your issue:
e.g.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
answered 13 hours ago
Rabbid76
29.8k112742
29.8k112742
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53343472%2fopengl-simple-2d-texture-not-being-displayed%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
Do you bind the texture-unit 0 to
tex
in your shader?– tkausl
16 hours ago
@tkausl My whole frag shader is pasted above, so I guess not? How do I do that?
– bpmw
16 hours ago
1
Your shader loading code is not, however. You do it the same way you'd set other uniforms, just set a int (
0
in this case) to the uniformtex
. Your error-handling is broken by the way, it ignores the first error it sees.– tkausl
16 hours ago
@tkausl here is my loading code. What function do I need to use to bind my uniform to 0?
– bpmw
16 hours ago
1
@tkausl But am I not already doing that in the render loop with
glUniform1i(glGetUniformLocation(programID, "tex"), 0);
?– bpmw
16 hours ago